Путать с переменной областью действия для цикла while и for (программирование на C) - PullRequest
4 голосов
/ 12 октября 2011

Сегодня, когда я кодировал, я столкнулся с чем-то, чего я не ожидал, что это произойдет таким образом. Ниже приведен только пример кода для проблемы.

Код 1

while(true)
{
 int i = 1;

 printf("This is %d\n" , i);
 ++i;
 if(i == 10)
   break;
}

Код 2

for(int i = 1 ; ; i++)
{
 printf("This is %d\n" , i);
 if(i == 10)
    break;
}

Вопрос:

1.) Первый код вызовет бесконечный цикл, а последний - нет.

2.) Я не понимаю, есть стандартная переменная упоминания, объявленная внутри цикла while, доступ к которому может получить любой оператор внутри цикла while, но почему if() не может получить доступ к значению переменной i, пока последняя может ??

Спасибо, что потратили время на чтение моего вопроса

Ответы [ 3 ]

11 голосов
/ 12 октября 2011

Все очень просто:

for(int i = 1 ; ; i++)
{
    printf("This is %d\n" , i);
    if (i == 10)
        break;
}

эквивалентно

{
    int i = 1;
    while (true)
    {
        printf("This is %d\n" , i);
        if (i == 10)
            break;
        i++;
    }
}

То есть, часть int i = 1 выполняется до первой итерации for -цикла. for вводит неявный дополнительный блок области видимости, содержащий все переменные, объявленные в X из for (X;Y;Z).

6 голосов
/ 12 октября 2011

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, определяется один раз для всех итераций цикла.

1 голос
/ 12 октября 2011

Проблема в том, что в вашем цикле while вы не только объявляете i, но и инициализируете его.Таким образом, на каждой итерации цикла i сбрасывается в 1, вызывая бесконечный цикл.

Цикл for инициализирует сначала i = 1, прежде чем запускать цикл, так что это больше похоже на написание цикла while:*

int i = 1;
while (true)
{
    printf("This is %d\n" , i);
    if (i == 10) break;
    i++;
}
...