代码之家  ›  专栏  ›  技术社区  ›  Laura

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

  •  1
  • Laura  · 技术社区  · 16 年前

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

    #include <stdio.h>
    
    main()
    {
        double nc;
    
        for (nc = 0; getchar() != EOF; ++nc)
            ;
        printf("%lf\n", nc );
        putchar(nc);
    }
    

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

    1 回复  |  直到 16 年前
        1
  •  2
  •   Carl Norum    16 年前

    你在打电话 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中,IBMPC的原始字符集,值3(十六进制03)表示心脏符号。该值与非打印ETX控制字符共享,后者在许多上下文中覆盖该值。