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