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?


person Prafiate    schedule 03.04.2013    source источник
comment
Вы должны убедиться, что значение (getchar() != EOF) равно 0 или 1. Предложение о круглых скобках означает, что без круглых скобок это то же самое, что и c = (getchar() != EOF).   -  person Daniel Fischer    schedule 03.04.2013
comment
Поскольку отрицательное значение int никогда не может иметь то же значение, что и char: неправильно. char значения могут быть отрицательными. Что происходит, так это то, что результат getchar() сначала внутренне конвертируется в unsigned char; затем результат этого преобразования преобразуется в int --- и именно это последнее преобразование (в основном) никогда не может быть отрицательным.   -  person pmg    schedule 04.04.2013
comment
Если вы сохраняете результат getchar в char, его реализация определяет, работает он или нет при проверке против EOF. Если char подписан, это может быть нормально, но он неправильно интерпретирует значение 255 как EOF, и это не очень хорошая практика.   -  person teppic    schedule 04.04.2013


Ответы (1)


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

c = (getchar() != EOF)

означает прочитать символ из stdin, затем сравнить его с EOF. Результатом будет 1, если истина, и 0, если ложь. Затем этот результат присваивается c. Прочитанный символ теряется, отсюда «нежелательный эффект».

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

person teppic    schedule 03.04.2013
comment
Спасибо, это было очень полезно - person Prafiate; 04.04.2013
comment
@Prafiate В той же книге на стр. 42 главы 2 они также более подробно рассказывают, говоря: «Точно так же было бы неудачно, если бы c был протестирован против EOF перед вызовом getchar; поэтому вызов и присвоение должны произойти до проверки символа в c. а затем они приводят пример с более подробным разъяснением того, почему важен приоритет. - person 3rika; 27.09.2016