Это взято прямо из книги 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?
(getchar() != EOF)
равно 0 или 1. Предложение о круглых скобках означает, что без круглых скобок это то же самое, что иc = (getchar() != EOF)
. - person Daniel Fischer   schedule 03.04.2013char
значения могут быть отрицательными. Что происходит, так это то, что результатgetchar()
сначала внутренне конвертируется вunsigned char
; затем результат этого преобразования преобразуется вint
--- и именно это последнее преобразование (в основном) никогда не может быть отрицательным. - person pmg   schedule 04.04.2013getchar
вchar
, его реализация определяет, работает он или нет при проверке противEOF
. Еслиchar
подписан, это может быть нормально, но он неправильно интерпретирует значение 255 как EOF, и это не очень хорошая практика. - person teppic   schedule 04.04.2013