1

我在玩 K&R 中的一个示例程序,发现这

#include <stdio.h>

main()
{
    double nc;

    for (nc = 0; getchar() != EOF; ++nc)
        ;
    printf("%lf\n", nc );
    putchar(nc);
}

产生的输出是 3.000000(这是我完全预料到的),然后是一条带有心脏的新线(我完全没想到)。为什么它会输出一个带有心脏的新行?我认为这与我混合数据类型有关。

4

1 回答 1

2

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 控制字符共享,在许多情况下会覆盖它。

于 2010-02-28T23:29:59.810 回答