以下while循环不会终止。这是因为变量x
正在while循环中重新声明。但我不明白为什么在第二次迭代中,语句x<10
和y=x
会考虑外部作用域中定义的x而不是块作用域中定义的x
。以下声明。
这是因为一旦第一次迭代结束,块范围中定义的x
被破坏并且循环开始执行新的?
#include<iostream>
int main () {
int x = 0, y;
while(x <10 ){
y = x;
std::cout<<"y is :"<< y <<std::endl;
int x = y + 1;
std::cout<<"x is :"<< x <<std::endl;
}
std::cout<<"While loop is over"<<std::endl;
}
答案 0 :(得分:4)
while循环每次迭代都会评估外部作用域x
,并为y
分配外部作用域x
的值。之后,在内部范围中定义了另一个x
,这是第二个std::cout
使用的内容,但该程序没有使用内部x
在下面的代码中,我用x
替换了内部z
,但行为是相同的。唯一的区别是内部范围内没有第二个x
来隐藏外部范围:
#include<iostream>
int main () {
int x = 0, y;
while(x <10 ){
y = x;
std::cout<<"y is :"<< y <<std::endl;
int z = y + 1;
std::cout<<"z is :"<< z <<std::endl;
}
std::cout<<"While loop is over"<<std::endl;
}
下面我有一个旨在消除困惑的例子。在内部范围x
未被重新声明&#34;,正在声明一个新的x
,它在}
之后超出范围:
#include<iostream>
int main () {
int x = 1;
{
int x = 2;
std::cout << x << '\n'; // 2
}
std::cout << x << '\n'; // 1
}
答案 1 :(得分:2)
是的,你理解正确。因此,每次在while
进行比较时,都会使用外部x
。
while (x < 10) {
y = x; //Here the x is the outer one. The inner one does not exist yet.
std::cout << "y is :" << y << std::endl;
int x = y + 1; // From here, x will refer to the inner one.
std::cout << "x is :" << x << std::endl;
// inner x is destroyed.
}