2

我正在完成 K&R 中的一些练习。练习 1-6 要求验证表达式getchar() != EOF是 0 还是 1。我明白为什么会这样,但是我编写的代码证明它没有按预期工作。我写了以下两个片段:

版本 1:

int main(void)
{
    int c;

    while (c = getchar() != EOF)
    {
        putchar(c);
    }

    printf("%d at EOF\n", c);

    return 0;
}

版本 2:

int main(void)
{
    int c;

    while (c = getchar() != EOF)
    {
         printf("%d\n", c);
    }

    printf("%d at EOF\n", c);

    return 0;
}

我的问题:

  1. 当我输入一个字符并使用版本一按 Enter 时,为什么我在屏幕上看不到 0 或 1?相反,我的光标移动到下一行的第一个位置,否则为空。我虽然putchar会发送cstdout.

  2. 虽然printf在第二个版本中使用确实会适当地产生 0 或 1,但它会为每个非 EOF 字符复制 1(我在我输入的每个字符的两个连续行上看到数字 1)。为什么?

非常感谢您的想法。如果有您认为有帮助的参考资料,请发送链接。

澄清:

我知道我正在分配 0 或 1 的 ca 值。这就是我想要做的,也是练习想要的。这也是我周围没有括号的原因c = getchar()。我的问题更多地涉及理解为什么输出不是我所期望的。很抱歉有任何混淆。

4

1 回答 1

4

赋值运算符=的优先级低于不等运算符!=

所以这:

while (c = getchar() != EOF)

被解析为:

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

因此,如果不是,则为 thenc分配布尔值 1 ,如果返回,则为 0 。getcharEOFEOF

结果,第一个程序打印 ASCII 码 1 的字符,这是一个不可打印的字符。这就是为什么你什么都看不到。第二个程序使用%d格式说明符 toprintf将数字 1 转换为其字符串表示形式。

您需要括号才能将结果getchar分配给c

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

编辑:

为了进一步阐明您得到的输出,在这两个程序中,变量在每个循环c内都有值 1 。while这里的区别在于putchar打印 ASCII 值为 1 的字符(不可打印的字符),而printf打印%d值为 1 的文本表示,即1.

如果您将printf调用更改为:

printf("%c", c);

您将获得与使用相同的输出putchar

至于每个字符打印两次 1 ,那是因为您实际上输入了两个字符:您按下的键,加上回车键。从控制台读取时,该getchar函数在按下回车键之前不会返回。

于 2017-07-03T21:42:46.173 回答