C、K&R练习1-6,卡住,困惑

标签 c getchar putchar

我是一个菜鸟,使用C 编程语言,第二版(由K&R)自学用 C 编程。在第 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 从命令提示符执行。

最佳答案

当您运行该程序时,您看到的字符并非来自您的程序。这是控制台(或终端)的 echo显示您输入的任何字符的功能(您甚至可以在按下 Enter 之前删除它们)。您的程序只输出 ASCII 代码为 0 或 1 的字符,这两个字符都是不可见的。

如果你改变putchar(c)printf("%d", c)您将能够看到一系列 1秒。不会出现零,因为当c变为零,循环停止并且不会被打印。

字符 '0''1'分别具有 48 和 49 的 ASCII 代码,尽管您的终端可能使用另一种编码。如果要输出文字数字 0,请使用字符表示法。你也可以试试 putchar(48)但不要过多使用它(您稍后会发现 it's highly discouraged 在您的程序中使用 magic numbers)。

putchar('0');
        ^ ^

断言

c = getchar() != EOF;

相当于

c = (getchar() != EOF);

是因为operator precedence .接线员!= (不等式)比 = 具有更高的优先级(赋值),因此它在赋值之前得到评估。

最后,极其很少有人写出那样的东西。正确的意图是这样写:

while ( (c = getchar()) != EOF )

关于C、K&R练习1-6,卡住,困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47493333/

相关文章:

c - 了解 K&R 中的 detab

c - 如何在C99模式下编译C工程?

c - 在 C 中 fork - 无限循环?

c - 将 getchar 与指针一起使用,如 char 数组

C: printf() 和 putchar() 问题

将十进制文字转换为 C 中 putchar 的 ASCII 等价物

c++ - 以非管理员身份在 Windows 上检查 C 中的上次文件修改时间

c - 如何在 C 中正确获取 y/n 输入

c - 如何正确读取整数?

c - 理解此递归 C 程序以反向打印字符串所需的解释