2016-06-21 16 views
1

Die folgende while-Schleife wird nicht beendet. Dies liegt daran, dass die Variable x innerhalb der while-Schleife neu deklariert wird. Aber ich verstehe nicht, warum die Anweisungen x<10 und y=x in der zweiten Iteration das im äußeren Bereich definierte x und nicht den im Blockumfang in der folgenden Anweisung definierten x berücksichtigen. Ist dies, weil, sobald die erste Iteration endet, die im Block Scope definierte x zerstört wird und die Schleife beginnt, frisch auszuführen?C++ Verwirrender Bereich der redeclared Variablen in for-Schleife

#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; 
} 

Antwort

4

jeder Iteration der Schleife, während der äußere Umfang auswertet und xy den Wert des äußeren Umfangs x zugeordnet ist. Danach eine weitere x in dem inneren Umfang definiert, was die zweite std::cout ist verwendet, aber das Programm macht keine andere Verwendung des inneren x

Im Code unten ich die innere x mit z ersetzt, aber ansonsten ist das Verhalten identisch . Der einzige Unterschied ist, dass es keine zweite ist x innerhalb einer inneren Umfang die äußere zu verbergen:

#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; 
} 

Im Folgenden werde ich ein Beispiel, die die Verwirrung löschen soll. Im inneren Umfang x nicht „erneut erklärt“ wird, ein neues x wird erklärt und es geht out of scope nach dem }:

#include<iostream> 

int main() { 
    int x = 1; 
    { 
     int x = 2; 
     std::cout << x << '\n'; // 2 
    } 
    std::cout << x << '\n'; // 1 
} 
2

Ja, Sie es richtig verstehen. Also jedes Mal, wenn in while vergleichen, ist es mit der äußeren 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. 
}