проверка условия в цикле for ++ i - PullRequest
4 голосов
/ 04 сентября 2011

Вот программа C:

int main()
{
   short int i = 0;

   for( ; ++i ; )          // <-- how this is checking condition 
     printf("%u,", i);

   return 0;
}

из вышеприведенной программы Я думал, что это пойдет для бесконечного цикла , как в for() нет ничего, чтобы проверить условие и выйти из цикла.

но я ошибся , это не бесконечный цикл .

Мой вопрос:
Как for( ; ++i ; ) проверяет состояние в вышеуказанной программе?

Ответы [ 2 ]

12 голосов
/ 04 сентября 2011

Программа неверна, поскольку переполняет со знаком int, что является неопределенным поведением в C. В некоторых средах приведет к бесконечному циклу, но многие компиляторы реализуют переполнение со знаком так же, как они реализуют беззнаковоепереполнение.

В случае, если переполнение со знаком реализовано как переполнение без знака, в какой-то момент i станет слишком большим, чтобы поместиться в короткое, и обернется вокруг и станет 0 - что сломаетсяпетля.В основном USHRT_MAX + 1 дает 0.

Так что измените i на unsigned short i = 0, и все будет хорошо.

1 голос
/ 04 сентября 2011
for ( init, condition, inc )

Ваше "состояние" i++.Когда i++ равно 0, оно выходит.При коротком замыкании это происходит довольно быстро.

Do for ( ; ;i++) для бесконечного цикла

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...