我在K& R的一个示例程序中鬼混,发现这个
#include <stdio.h>
main()
{
double nc;
for (nc = 0; getchar() != EOF; ++nc)
;
printf("%lf\n", nc );
putchar(nc);
}
产生的输出为3.000000(我完全预料到的)然后是一个带有心脏的新线(我完全没想到)。为什么会输出一条带有心脏的新线? 我认为它与我混合数据类型有关。
答案 0 :(得分:2)
您使用putchar()
作为参数调用double
。它将隐式地转换为int
,然后输出该字符。你得到了心脏,因为出于某种原因你的角色集有一个心脏作为字符编号3.如果你运行它并在EOF
之前输入更多字符,你将获得一个不同的角色。在我的机器上,你的程序不会成为一颗心,但如果我输入更多字符,我可以在下一行获得我想要的任何东西。 ASCII字符3是ETX
,文本的结尾,所以我不知道为什么你会在你的情况下得到心脏 - 你使用一些奇怪的语言环境或字符集?该程序在您的机器上输出了什么:
#include <stdio.h>
int main(int argc, char *argv[])
{
putchar(3);
putchar('\n');
return 0;
}
编辑:
你的心脏因为那就是你位置3的角色设置。来自wikipedia:
在代码页437中,IBM PC的原始字符集,值3(十六进制03)表示心脏符号。此值与非打印ETX控制字符共享,在许多上下文中都会覆盖它。