Intereting Posts
Статические переменные и streamи (C) динамическое распределение памяти в массиве 2d и использование scanf Почему язык программирования требует ключевых слов? Защита streamов данных только для чтения Чтение файла с использованием fgets и печать его содержимого на экране C инициализация глобальной статической переменной выполняется компоновщиком? Free () удаляет данные, хранящиеся в динамически распределенной памяти? Биты разрешения разделяемой памяти в системе V: значение и способы изменения Является ли листинг free () аргументом для void * required? Есть ли способ получить поплавок из параметров функции varargs? Силовой удельный размер структуры в C Безопасно ли делиться изменчивой переменной между основной программой и ISR в C? C – возможность выравнивания типа Отображение многобайтовых символов в их представление в виде unicode В чем разница между if (CONST == variable) или if (variable == CONST)?

Почему EOF совпадает с действительным значением char?

Как сказано в комментариях к ответу на этот вопрос: Почему gcc не создает предупреждение о несоответствии типа для int и char?

как -1, так и 255 – 0xFF как 8-битный HEX-номер на любом текущем CPU.

Но EOF равно -1. Это противоречие, потому что значение EOF не должно совпадать с любым допустимым 8-битным символом. Этот пример демонстрирует это:

#include  int main(void) { char c = 255; if (c == EOF) printf("oops\n"); return 0; } 

На моей машине печатает oops .

Как можно объяснить это противоречие?

Когда вы сравниваете значение int значением char значение char повышается до значения int . Эта акция является автоматической и частью спецификации языка C (см., Например, ссылку «Обычные арифметические преобразования» , особенно пункт 4). Конечно, компилятор может предупредить об этом, но почему это должно быть, если это допустимая языковая конструкция?

Также существует проблема с подписью char которая определена реализацией. Если char без знака, ваше условие будет ложным.

Также, если вы читаете практически любую ссылку для функций, считывающих символы из файлов (например, для fgetc и getc ), вы увидите, что они возвращают int а не char , именно по причинам, упомянутым выше.