#include <stdio.h>
int main() {
for (char c=0; c<128; c++) {
printf("%c", c);
}
}
Вывод кода снова и снова печатает весь список символов.
Но я также попробовал запустить этот код:
#include <stdio.h>
int main() {
for (char c=0; c<127; c++) {
printf("%c", c);
}
}
Единственное изменение - это состояние. Теперь он работает нормально, не входя в бесконечный цикл.
Что является причиной этого?
Я думаю, вы можете изменить char на unsigned char, и это сработает. Не уверен, приемлемо ли это для вашего случая.
В этом случае может быть полезно использовать %d в строке формата.
Всегда включайте предупреждения вашего компилятора! С gcc я использую -Wall -Wextra -pedantic
@Peter-ReinstateMonica: переполнения нет. c++ определяется как c = c+1, за исключением того, что lvalue вычисляется только один раз. c+1 указан для применения обычных арифметических преобразований, которые переводят charc в int. Затем сложение выполняется в арифметике int, в результате чего получается 128 без переполнения. Затем выполняется =, который предназначен для преобразования значения в тип его левого операнда char. Это преобразование определяется реализацией.
@EricPostpischil Ах, интересно! Спасибо. Я удалил свой комментарий. Я предлагаю вам оставить свой на месте; это интересная информация.





В C это определяется реализацией, если тип char ведет себя как signed char или unsigned char. Если он ведет себя как signed char, он может содержать значения только от -128 до 127 включительно. Ваш цикл for пытается дойти до 128, но поскольку char может удерживать только 127, он никогда не достигнет 128.
Проверка условия проверяет, если c < 128, и останавливается, когда c == 128. Когда c = 127, цикл продолжается до c + 1 = -128. Таким образом, он повторяется снова и снова и никогда не останавливается, потому что никогда не достигает 128.
Ваш второй цикл останавливается на 127, поскольку структура char может содержать до 127, поэтому условие выполняется и цикл завершается.
в дополнении до 2 это от -128 до 127.
Я бы заменил «В C структура char может содержать значения только от -128 до 127» на «Очень часто char может только ...», поскольку C не требует, чтобы char мог хранить только - От 128 до 127. Однако в большинстве реализаций это диапазон.
char не является структурой. Структуры — это особые вещи в C, последовательность объектов-членов. char — это тип, а экземпляр char — это объект char.
Re «Когда c = 127, цикл продолжается до c + 1 = -128»: вероятно, это то, что произошло в системе OP, но следует отметить, что арифметика выполняется с типом int, поэтому 127 увеличивается до 128, и это преобразуется обратно в тип char. Это преобразование определяется реализацией, поэтому оно может выдавать -128, но реализация C может также определить его для создания других значений, например 127 (ограничение вместо переноса) или для создания сигнала.
Кажется, в вашей системе тип char ведет себя как тип signed char. (Примечание: тип char может вести себя как тип signed char или unsigned char в зависимости от параметров компилятора.) Максимальное положительное значение для этого типа — 127. Проверить это можно с помощью простой программы:
#include <stdio.h>
#include <limits.h>
int main( void )
{
printf( "SCHAR_MAX = %d\n", SCHAR_MAX );
}
Итак, в первом цикле, когда c равно 127, выражение c++ приводит к переполнению значения, хранящегося в c. Таким образом, первый цикл становится бесконечным.
Если вы хотите вывести все символы в диапазоне [0, SCHAR_MAX], вы можете использовать, например, цикл do while
char c = 0;
do
{
printf( "%x", c );
} while ( c++ != SCHAR_MAX );
Обратите внимание, что не все символы этого диапазона имеют графическое представление.
charподписан в вашей системе, и его максимальное значение равно127. Итак, условиеc<128всегда истинно. Также вы, вероятно, получаете предупреждения от компилятора об этом.