我正在完成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输入时,为什么我在屏幕上看不到0或1?相反,我的光标移动到下一行的第一个位置,否则为空。我虽然putchar
会将c
发送给stdout
。
虽然在第二个版本中使用printf
会产生适当的0或1,但它会为每个非EOF字符复制1(我在每个字符的两个连续行上看到数字1我输入)。为什么呢?
非常感谢您的想法。如果有您认为有帮助的参考,请发送链接。
澄清:
我知道我正在为c赋值0或1.这就是我想要做的,而这正是练习所需要的。这也是我c = getchar()
周围没有括号的原因。我的问题更多地解释为什么输出不是我预期的。抱歉有任何困惑。
答案 0 :(得分:3)
赋值运算符=
的优先级低于不等式运算符!=
。
所以这个:
while (c = getchar() != EOF)
解析为:
while (c = (getchar() != EOF))
因此c
如果getchar
不是EOF
,则为EOF
分配布尔值,如果返回%d
,则为{0}分配。
结果,第一个程序打印ASCII代码1的字符,这是一个不可打印的字符。这就是你什么也看不见的原因。第二个程序使用printf
格式说明符getchar
,将数字1转换为其字符串表示形式。
您需要括号才能将c
的结果分配给while ((c = getchar()) != EOF)
:
c
编辑:
为了进一步阐明您获得的输出,在两个程序中,变量while
在每个putchar
循环内的值为1。这里的区别在于printf
正在打印ASCII值为1的字符(不可打印的字符),而带有%d
的{{1}}打印值1的文本表示,即{{ 1}}。
如果您将1
调用更改为:
printf
您将获得与使用printf("%c", c);
相同的输出。
至于每个字符打印1次,这是因为您实际输入了两个字符:您按下的键和输入键。从控制台读取时,在按下回车键之前,putchar
功能不会返回。