Почему цикл "for (i = 100; i <= 0; --i)" навсегда? - PullRequest
3 голосов
/ 25 января 2011
unsigned int i;
for (i = 100; i <= 0; --i)
    printf("%d\n",i);

Ответы [ 9 ]

11 голосов
/ 25 января 2011

Должно быть i >= 0 во втором условии цикла, если вы хотите, чтобы оно повторялось от 100 до 0.

Это, и, как отмечали другие, вам нужно изменить определение i на целое число со знаком (просто int), потому что, когда предполагается, что счетчик равен -1, это будет какой-то другой положительное число, потому что вы объявили его unsigned int.

10 голосов
/ 25 января 2011

Поскольку i не подписано, оно никогда не будет меньше нуля. Drop unsigned. Также, поменяйте <= на >=.

7 голосов
/ 25 января 2011

Поскольку i не подписано, выражение i <= 0 является подозрительным и эквивалентно i == 0.

И код ничего не печатает, поскольку условие i <= 0 ложно в самом егоПервая оценка.

4 голосов
/ 25 января 2011

Если код должен ничего не делать, с ним все в порядке.

Предполагая, что вы хотите напечатать индекс цикла i со 100 до 1, вам нужно изменить i <= 0 на i > 0.

Поскольку это целое число без знака, вы не можете использовать i >= 0, потому что это приведет к его бесконечному циклу.

2 голосов
/ 25 января 2011

Я подозреваю, что вы имели в виду тест i > 0.

2 голосов
/ 25 января 2011

Технически, с этим кодом все в порядке.Тест для i <= 0 является странным, поскольку я не подписан, но технически он допустим, true, когда i равен 0, и false в противном случае.В твоем случае мне никогда не бывает 0. </p>

2 голосов
/ 25 января 2011

Цикл проверяет, что i <= 0;

i никогда не меньше или равно нулю.Его начальное значение 100.

2 голосов
/ 25 января 2011

Возможно <= 0? так как это <code>false с самого начала

Для цикла

  • init: я = 100
  • test: i <= 0 // false при первом проходе </li>

Изменить тест на i > 0 (100 раз)

или i >= 0 (101 раз) вместе с объявлением signed int i;, так что оно фактически уменьшается до -1 Целое число без знака будет изменяться от 0 до max-int (переполнение).

0 голосов
/ 25 января 2011

Если вы хотите напечатать все числа от 100 до 0, тогда вам нужно

unsigned int i;
for (i = 100; i >= 0; --i)
    printf("%d\n",i);

При первом запуске цикла в исходном коде мне было 100. Тест 100 <= 0 не удался, и поэтому ничего не показывалось. </p>

...