Я новичок, учусь программировать на C, используя Язык программирования C, второе издание (от K&R). В главе 1, раздел 1.5.1 Копирование файлов, авторы очень кратко касаются операционного приоритета при сравнении значений, подчеркивая важность использования круглых скобок в данном случае, чтобы гарантировать, что переменная 'c' перед оценкой сравнения. Они утверждают, что:
c = getchar() != EOF
эквивалентно
c = (getchar() != EOF)
Что "имеет нежелательный эффект установки c
в 0 или 1, в зависимости от того, обнаружил ли вызов getchar конец файла"
Затем авторы ставят Упражнение 1–6. Убедитесь, что выражение getchar () != EOF
равно 0 или 1.
Судя по предыдущему утверждению автора, это казалось почти тривиальным, поэтому я создал этот код:
#include <stdio.h>
main()
{
int c;
while (c = (getchar() != EOF))
putchar(c);
}
К сожалению, когда я запускаю программу, она просто выводит любые символы, которые я ввожу в командное окно, а не ожидаемую строку 1 или 0, если встречается EOF.
Хотя я новичок, я думаю, что понимаю логику, которой пытаются научить авторы, и все же я не могу продемонстрировать эту простую задачу. В этом случае, не должна ли переменная c
принимать значение, которое оценивается выражением сравнения, а не какой-либо символ getchar()
, который может быть извлечен, особенно из-за расположения скобок? Если c
действительно принимает значение сравнения, putchar()
должен выводить только 0 или 1 и, тем не менее, как сформулировано, он выводит то, что я набираю в командном окне. Что я делаю неправильно? Что я не понимаю? Может быть, это мой компилятор? Я пишу код в Visual Studio 2017 Community edition в Windows 10 на архитектуре x64. У меня есть Tiny C Compiler, но я еще не пробовал запускаться из командной строки с TCC.
0
или1
на самом деле не являются печатаемыми символами ни в какой кодировке. Используйте, например,printf("%d\n", i)
вместо этого. - person Some programmer dude   schedule 26.11.2017((c = getchar()) != EOF)
?? - person David C. Rankin   schedule 26.11.2017cl
(cl.exe
) из командной строки с минимальными параметрамиcl /nologo /Wall /Ox /Feyourexe /Tc yoursource.c
(вы можете добавить/Fo
, например,/Foobjfile
, чтобы указать имя объектного файла). Это помогает иметь подкаталогиobj
иbin
, чтобы сохранить ваш каталог файлов-ресурсов очистите и используйте/Foobj/thename /Febin/thename /Tc thename.c
, чтобы поместить объектные файлы в подкаталогobj
, а исполняемые файлы - в подкаталогbin
. Удачи. (используйте/wd####
для подавления отдельных предупреждений) - person David C. Rankin   schedule 26.11.2017putchar(c?'1':'0');
и не получил результата. Я ставлюfflush(stdout);
послеputchar()
, и тогда я вижу результат, но только после нажатия клавиши ввода. Я думаю, что реализации этой функции в POSIX могут отличаться от ожиданий авторов K&R. - person lockcmpxchg8b   schedule 26.11.2017