1

以下 while 循环不会终止。x这是因为在 while 循环中重新声明了变量。但我不明白为什么在第二次迭代中,语句x<10y=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;
}
4

2 回答 2

4

每次迭代,while 循环都会评估外部范围xy分配外部范围的值x。之后,x在第二个使用的内部范围中定义了另一个std::cout,但是程序没有对内部进行其他使用x

在下面的代码中,我将内部替换为xz但其他行为是相同的。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没有被“重新声明”,x正在声明一个新的并且它在之后超出范围}

#include<iostream>

int main () {
    int x = 1;
    {
        int x = 2;
        std::cout << x << '\n'; // 2
    }
    std::cout << x << '\n'; // 1
}
于 2016-06-21T05:39:30.693 回答
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.
}
于 2016-06-21T05:42:18.517 回答