EOF упражнение 1-6 K&R язык программирования C


Это взято непосредственно из книги K&R:

Приоритет != выше, чем у =, Что означает, что при отсутствии скобок реляционный тест != будет выполняться до присвоения =. Итак, утверждение

c = getchar() != EOF

Эквивалентно

c = (getchar() != EOF)

Это имеет нежелательный эффект установки c в 0 или 1, в зависимости от того, возвращает ли вызов getchar конец файла. (Подробнее об этом в главе 2.)

Упражнение 1-6. убедитесь, что выражение getchar() != EOF равно 0 или 1.

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

Я знаю, что EOF является символьной константой типа int и обычно имеет значение -1. Поскольку отрицательное значение int никогда не может иметь то же значение, что и char, когда он делает сравнение, его нужно продвинуть до int, который затем каким-то образом сигнализирует о конце файл.

Я также понимаю, что без скобок, указанных выше, сравнение != выполняется до задания, но что это на самом деле означает? Что же происходит с этой функцией? Также я напечатал значение EOF и было -1, что означает это упражнение, когда он говорит, проверьте это 0 или 1?

1 3

1 ответ:

Он говорит, что:

c = (getchar() != EOF)

Означает прочитать символ из stdin, а затем сравнить его с EOF. В результате получается 1, если это правда, и 0, если это ложь. Этот результат затем присваивается c. Символ, который был прочитан, теряется, следовательно, "нежелательный эффект".

Он хочет, чтобы вы сами запустили это таким образом, чтобы увидеть, как вы можете произвести 0 и 1, отправив EOF против любого другого символа.