混合数据类型会导致心输出

时间:2010-02-28 23:24:07

标签: c types character kr-c

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

#include <stdio.h>

main()
{
    double nc;

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

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

1 个答案:

答案 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控制字符共享,在许多上下文中都会覆盖它。