Золотое правило для написания этой строки:
while ((ch = fgetc(stdin)) != EOF)
ch
должно быть int
. Ваша милая хитрость в создании ch
без знака не удалась, потому что EOF
- это целое число со знаком.
Хорошо, теперь давайте углубимся в глубину ......
Шаг 1:
ch=fgetc(fp)
fgetc()
возвращает -1
(подписано int
). По золотым правилам C ch
получает последний октет битов, который равен всем 1
. И, следовательно, значение 255
. Шаблон байтов ch
после выполнения
ch = fgetc(fp);
будет, таким образом,
11111111
Шаг 2:
ch != EOF
Теперь EOF
- это целое число со знаком , а ch
- это unsigned char
...
Снова я обращаюсь к золотому правилу C ... меньший парень ch
преобразуется в большой размер int
перед сравнением, поэтому его байтовый шаблон теперь
00000000000000000000000011111111 = (255)10
пока EOF
равно
11111111111111111111111111111111 = (-1)10
Нет никакого способа, которым они могут быть равны ....... Отсюда утверждение, чтобы управлять следующим циклом while
while ((ch = fgetc(stdin)) != EOF)
никогда не будет оцениваться как ложное ...
И, следовательно, бесконечный цикл.