2016-06-21 5 views
1

Следующий цикл while не завершается. Это связано с тем, что переменная x повторно объявляется внутри цикла while. Но я не понимаю, почему во второй итерации вперед в операциях x<10 и y=x рассматривается x, определенная во внешней области видимости, а не x, определенная в области блока в следующем выражении. Это потому, что как только первая итерация заканчивается, x, определенный в области блока, уничтожается, и цикл начинает выполнять свежий?C++ Запугивание области переопределенных переменных для цикла

#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

каждой итерации петли, а оценивает внешний объем 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 не будучи «повторно объявлен» новый 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. 
} 
Смежные вопросы