C ++ Запутанная область переопределенных переменных в цикле for

Следующий цикл 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;
}

1

Решение

Каждая итерация цикла 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
}
4

Другие решения

Да, вы правильно поняли. Так что каждый раз, когда сравнивать в 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.
}
2

По вопросам рекламы [email protected]