变量重新识别导致无限循环

时间:2018-02-17 07:55:07

标签: c++

为什么这段代码会导致无限循环:

#include <iostream>
using namespace std;

int main() {
    int y = 5;
    while (y < 6) {
        y = 7;
        cout << y << endl;
    }
}

然后删除while语句中的“int”会使它正常运行一次吗? (

shared_ptr

2 个答案:

答案 0 :(得分:1)

在这个循环中:

while (y < 6) {
    int y = 7;
    cout << y << endl;
}

条件测试中无法访问内部y

如果删除循环中的int,则只需为while之外定义的变量分配新值,从而终止它。

CppReference上查找范围。

答案 1 :(得分:0)

您观察到的行为称为shadowing。 这意味着变量被内部范围中的另一个变量“遮蔽”。 (iBug已经提供了C ++范围规则的链接) 外部作用域(在您的情况下为while(y < 6))无法访问内部作用域(在您的情况下为int y = 7;),反之亦然。两者都具有相同的名称,但它们在不同的范围内是完全独立的变量。

这是一个非常常见的错误来源(你在这里也发现了很多)并且不仅发生在循环和其他范围括号中,而且经常与类成员发生。想象一下课程:

class MyClass {
    int a;
public:
    void getA( int a ) { return a; }
};

getA()定义了一个参数a,它隐藏了类成员a。这至少是糟糕的风格,但更可能是错误的来源。我们不知道 - 你想要退回会员a还是你真的是指参数?所以这应该避免。

以下是Stackoverflow的真实例子 - 请参阅我在问题下面的评论(关于第3个构造函数)

避免这类错误的可能性是:

  • 使用最高可能的编译器警告甚至警告作为错误。编译器可以警告这些阴影问题。
  • 使用名称方案。常见方案是具有mm_前缀,_后缀等的成员。如果MyClass中的成员名称为m_a,则可以减少混淆。当然,这对你的例子没有帮助,但不过这是一个好主意。