我有这个简单的代码(尝试在KandR中进行练习): -
#include <stdio.h>
int main(){
int c = EOF;
while(c=(getchar() != EOF)){
printf("%d",c);
}
return 0;
}
当我运行它并输入任何字符(单个字符)时,我得到输出为11.如果我输入多个字符,例如'bbb',我得到输出为1111.我明白我已经明确添加了括号优先考虑getchar()!= EOF的条件检查,它应该导致1或0.但我不明白为什么我得到多个1。
另一个案例是:
#include <stdio.h>
int main(){
int c = EOF;
while(c=(getchar() != EOF)){
putchar(c);
}
return 0;
}
无论我输入哪个角色,我总是将输出作为一个方框,其中包含1和0(显示在下方屏幕截图的底部)
1)在第一种情况下,为什么输出打印超过1 1?
2)为什么案例2的输出与案例1不相同?
答案 0 :(得分:3)
除非您按EOF
,否则(getchar() != EOF)
将返回true
,1
将c
分配给11
。这就是为什么输出始终为1
,输入的字符为1
,第二个\n
为putchar
按输入输入缓冲区键。
同样在1
的情况下,它会打印与返回值32
对应的字符,该字符是不可打印的(可打印字符从\n
开始),您将获得一些奇怪的输出,一个用于输入字符,另一个用于while( (c=getchar()) != EOF ){...}
。
现在将条件表达式中的括号更改为
\n
现在它将按预期工作,但在第一种情况下会给你两个ASCII码(一个用于{{1}})。
答案 1 :(得分:2)
1)在第一种情况下,为什么输出打印超过1 1?
因为您正在寻找EOF
。要从键盘发送程序EOF
,请按 Ctrl + Z
2)为什么案例2的输出与案例1不相同?
因为%d
生成字符代码的十进制表示,而putchar
生成字符本身。例如,如果您使用'A'
的{{1}}格式打印printf
,则会看到%d
- 大写字符65
的ASCII代码。另一方面,如果您使用A
进行打印,则会看到字符putchar
本身。