2010-02-28 37 views
1

我用在K & R中的样品节目之一打打闹闹,并且发现,这种混合数据类型的结果在心脏输出

#include <stdio.h> 

main() 
{ 
    double nc; 

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

产生输出即3.000000(我完全预期),则新的线上有一颗心(我完全没有想到)。为什么它会输出一个新的内心? 我认为它与我混合的数据类型有关。

+0

我知道为什么新行 - 只是为什么心的形状感兴趣。 – Laura

回答

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

+0

当我运行它时,这只是一颗心。 :) – Laura

+0

@Laura,是的,这是预期的。我用更多的信息编辑了我的答案。人物3是一颗心,这就是它的全部。 –

+0

谢谢!今天学到更多:) – Laura