2016-06-21 8 views
1

次のwhileループは終了しません。これは、変数xがwhileループ内で再宣言されているためです。しかし、2回目以降の反復で、ステートメント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用途で内側範囲で定義されたが、私はzとインナーxを置き換え、以下のプログラムコードに内側x

の他の使用を行いませんが、それ以外の挙動は同一であります。唯一の違いは、第二xが外側ものを隠すために、より内側の範囲に存在しないということである:I以下

#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. 
} 
関連する問題