Пример цикла for в C, приводящего к бесконечному циклу - PullRequest
0 голосов
/ 27 октября 2018

Следующая программа упоминалась как входящая в бесконечный цикл:

#include<stdio.h> 
int main() 
{ 
   int n; 
   for(n = 7; n!=0; n--) 
     printf("n = %d", n--); 
   getchar(); 
   return 0; 
}

Анализируя, я обнаружил, что в какой-то момент значение n становится равным 0, и тогда цикл должен завершиться.Не случится ли так, что, когда он входит в цикл в первый раз, значение равно 7, затем оно становится равным 6, и с тех пор на каждую итерацию приходится 2 пост-декремента?Но почему этого не происходит?

Ответы [ 3 ]

0 голосов
/ 27 октября 2018

Это из-за второго декрета здесь:

for(n = 7; n!=0; n--) 
    printf("n = %d", n--); 

Это делает последовательность проверок против n равной 7, 5, 3, 1, -1, ... Есть четное число значений для целого числа, так что это будет формировать цикл при потере, который пропускает четные числа в том числе 0.

Помните, что условие цикла for вычисляется непосредственно перед каждой итерацией цикла и после уменьшения в самом цикле. Он не тестируется во время работы цикла.

0 голосов
/ 27 октября 2018

Каждая итерация цикла фактически уменьшает n на два, и сравнение n != 0 всегда видит нечетное значение для i и, следовательно, никогда не завершается.

В частности, непосредственно перед рассматриваемой итерацией n сначала уменьшается до 1 на n-- в заголовке цикла (поскольку это должно произойти после окончания предыдущей итерации, непосредственно перед оценкой условия n!=0) .

Затем оценивается printf("n = %d", n--);, печатается n = 1, в то время как post уменьшается n до нуля. После окончания тела цикла значение n снова уменьшается на n-- в заголовке цикла, делая его равным -1, непосредственно перед тем, как условие n!=0 будет оценено, чтобы определить, должен ли цикл продолжаться.

В результате, n!=0 имеет значение true каждый раз, когда он оценивается (в частности, он не оценивается в момент, когда n равно нулю, поскольку n-- в заголовке цикла должен сначала завершиться)

0 голосов
/ 27 октября 2018

попробуйте сделать это

#include<stdio.h> 
int main() 
{ 
   int n; 
   for(n = 7; n>=0; n--) 
     printf("n = %d", **--n**); 
   getchar(); 
   return 0; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...