C ++在for循环中混淆重新声明的变量范围

时间:2016-06-21 05:29:31

标签: c++ while-loop scope redeclaration

以下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;
}

2 个答案:

答案 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.
}