Почему это бесконечный цикл?

Я пытался записать символ 255 ascii на консоль, но у меня есть бесконечный цикл

for(char i=0; i<256; i++) {
cout << i << ' ';
}

5

Решение

Так как i никогда не может быть больше или равно 256, Это переполнится перед этим. Помните, что это тип char чье максимальное значение может быть 255 если это неподписанный, иначе 127 если это подписанный.

Будь то char является неподписанный или же подписанный, определяется реализацией. Но обычно, по моему опыту, это подписано, что обычно означает максимальное значение char может достичь 127,

Так i приращения от 0 в 127затем становится -128 от которого оно увеличивается до 127и так далее, хорошо, если это подписанный. Если это неподписанный, тогда это пойдет от 0 в 255то дальше станет 0 (из-за переполнения), и история начинается снова и снова!

13

Другие решения

Так как все значения char меньше 256

Для сравнения char i преобразуется в int, что обычно приводит к значению от -128 до 127 (с 8-битным дополнением со знаком 2) chars) или от 0 до 255 (включительно), если char это 8-битный тип без знака.

Однажды максимальное значение char удержание может быть достигнуто, дальнейшее увеличение приведет к циклическому изменению до 0, если char без знака, и для преобразования, определенного реализацией int значение 128, что приращение производится до char когда он хранится обратно, обычно результат -128, когда char подписан

5

Вы должны скомпилировать с предупреждениями о (-Wtautological-compare по этому вопросу).

В C ++ каждый целочисленный тип имеет диапазон возможных значений. Этот диапазон (обычно) определяется реализацией, хотя на распространенных платформах (x86) часто приходится иметь:

  • signed char в [-128, +127] (+)
  • short в [-2 *15, 2* 15-1]
  • int в [-2 *31, 2* 31-1]

Если вы попытаетесь увеличить целочисленный тип со знаком сверх его максимального значения, вы вводите область неопределенное поведение. В распространенных реализациях это оборачивается (как и для типов без знака), поэтому 127 + 1 становится -128 (для char).

Когда вы сравниваете с 256вы сначала приводите значение из i в int (тип 256 без интегральных суффиксов), а затем выполните сравнение. Тем не менее, так как i всегда находится в диапазоне [-128, 127] (+), он строго уступает 256 поэтому условие всегда верно.

(+) Это реализация, определенная ли char подписано или нет, если char является беззнаковым, тогда его диапазон более вероятен [0, 255].

3

Попробуй это!

for(int i=0; i<256; i++)
{
cout << char(i) << " ";
}
2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector