Почему обратный отсчет беззнакового цикла int навсегда в C? - PullRequest
5 голосов
/ 14 августа 2011

Код ниже работает в бесконечном цикле. 'i' инициализируется значением 1, а затем сравнивается с 0.

Таким образом, printf () stmt должен выполняться один раз, но он выполняется бесконечно.

unsigned int i = 1;
for (; i >= 0; i--) {
    printf("Hello: %u\n",i);
}

Пожалуйста, объясните это поведение.

Ответы [ 5 ]

10 голосов
/ 14 августа 2011

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

Когда i равен нулю и вы набираете i--, значение i округляется до значения максимум , которое может иметь unsigned int (больше нуля).

Вы должны использовать целое число со знаком, удалив модификатор unsigned.

7 голосов
/ 14 августа 2011

Как сказали другие ответы, это потому, что это без знака и все.Я расскажу вам элегантный способ сделать то, что вы хотите сделать с целым числом без знака.

unsigned int i=10;
while(i --> 0) printf("Hello:%u\n", i+1);

Этот --> иногда называют , идущим к оператору Но на самом деле это просто -- и >.Если вы измените интервал, вы получите

while( i-- > 0 )

My2c

3 голосов
/ 14 августа 2011

Это unsigned int. Снижение его с 0 приведет к , а не и даст -1.

Чтобы достичь намеченной цели, вам нужно удалить квалификатор unsigned. Это исправит целочисленное переполнение , вызывающее наблюдаемое поведение.

1 голос
/ 14 августа 2011

Определив i как unsigned int, вы сделали его всегда неотрицательным целым числом, поэтому все возможные значения i могут иметь все положительные целые (в своем диапазоне) и 0. Следовательно, условие в цикл всегда имеет значение true, так как i всегда либо больше или равен 0, поэтому он работает бесконечно.

1 голос
/ 14 августа 2011

Стандарт говорит, что для целых чисел без знака, если результат опустится ниже нуля, вы добавляете 2 ^ n, где n - количество битов в представлении.

Поскольку целое число является беззнаковым, компилятор оптимизирует его так, чтобыбесконечный цикл.

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