Следующий цикл while не завершается. Это потому, что переменная x
объявляется внутри цикла while. Но я не понимаю, почему во второй итерации и далее утверждения x<10
а также y=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;
}
Каждая итерация цикла 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
не «повторно объявлен», новый x
объявляется и выходит за рамки после }
:
#include<iostream>
int main () {
int x = 1;
{
int x = 2;
std::cout << x << '\n'; // 2
}
std::cout << x << '\n'; // 1
}
Да, вы правильно поняли. Так что каждый раз, когда сравнивать в 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.
}