【发布时间】:2018-05-09 15:40:06
【问题描述】:
我是一个自学用 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);
}
不幸的是,当我运行程序时,如果遇到 EOF,它只会输出我在命令窗口中键入的任何字符,而不是预期的字符串 1 或 0。
虽然我是个菜鸟,但我想我明白作者试图教授的逻辑,但我无法演示这个简单的任务。在这种情况下,变量 c 是否应该采用比较表达式计算的值,而不是 getchar() 碰巧获取的任何字符,特别是因为括号的位置?如果c 确实具有比较值,putchar() 应该只输出 0 或 1,但按照公式,它会输出我在命令窗口中键入的内容。我究竟做错了什么?我不明白什么?会不会是我的编译器?我在 x64 架构的 Windows 10 上的 Visual Studio 2017 社区版中进行编码。我有 Tiny C 编译器,但尚未尝试使用 TCC 从命令提示符执行。
【问题讨论】:
-
整数值
0或1在任何编码中都不是真正可打印的字符。使用例如printf("%d\n", i)代替。 -
也许 OP 看到了 OP 给出的任何输入......是的,这些都不是什么可怕的
-
可能是
((c = getchar()) != EOF)?? -
伙计们。我对你的评论速度感到惊讶。
-
不,这不是你的编译器。确保您正在使用 VS 开发人员控制台并在命令行中使用
cl(cl.exe) 以及最小选项cl /nologo /Wall /Ox /Feyourexe /Tc yoursource.c(您可以添加/Fo,例如/Foobjfile来命名目标文件)拥有obj和bin子目录有助于保持您的源文件目录干净,并使用/Foobj/thename /Febin/thename /Tc thename.c将目标文件放在obj子目录中,将可执行文件放在bin子目录中。祝你好运。 (使用/wd####禁止个别警告)