为什么这段代码会导致无限循环:
#include <iostream>
using namespace std;
int main() {
int y = 5;
while (y < 6) {
y = 7;
cout << y << endl;
}
}
然后删除while语句中的“int”会使它正常运行一次吗? (
shared_ptr
)
答案 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个构造函数)
避免这类错误的可能性是:
m
,m_
前缀,_
后缀等的成员。如果MyClass
中的成员名称为m_a
,则可以减少混淆。当然,这对你的例子没有帮助,但不过这是一个好主意。