C имеет понятие блочных областей. Переменная, объявленная в данной области видимости, имеет время жизни, эквивалентное этой области. В случае цикла while
это означает, что для каждой итерации цикла существует одна переменная i
. Каждый раз, когда цикл перезапускается, он создает новый i
и устанавливает его значение на 1
. i++
оценивается только один раз в этом случае, и, следовательно, оно никогда не достигнет 10
и действительно будет бесконечным циклом.
Первый пример кода можно исправить, просто переместив i
перед while loop
.
int i = 1;
while (true) {
printf("This is %d\n" , i);
++i;
if(i == 10)
break;
}
Теперь i
объявлен во внешней области видимости и, следовательно, будет один i
для всех итераций цикла while
.
Случай с циклом for
работает практически по той же причине. Переменная итерации, объявленная в цикле for
, определяется один раз для всех итераций цикла.