2016-06-21 175 views
1

以下while循環不會終止。這是因爲變量x正在while循環內重新聲明。但我不明白爲什麼在第二次迭代之後,語句x<10y=x考慮在外部作用域中定義的x,而不是在以下語句中在塊作用域中定義的x。 這是因爲一旦第一次迭代結束,塊範圍中定義的x被銷燬,循環開始執行新鮮事?C++混淆for循環中重新聲明的變量範圍

#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

每次迭代的while循環計算外部範圍xy分配外部範圍x的值。此後另一個x在內範圍這就是第二std::cout使用被限定,但該程序使得沒有其他用途的內x

在下面的代碼我與z替換內x但在其他的行爲是相同。唯一的區別是,沒有一個第二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 
} 
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. 
}