为什么程序的输出如此?

时间:2013-07-28 12:01:10

标签: c

# include <stdio.h>

int main()
{
 int a=4;
 printf("%f",a);
}

输出

0.000000 

另外

# include <stdio.h>

int main()
{
 float a=4.5;
 printf("%d",a);
}

输出

0

有人能解释上述输出的行为吗? 我知道使用不同的转换规范是愚蠢的,但我只是要求理论上的目的。

2 个答案:

答案 0 :(得分:2)

  

有人可以解释上述输出的行为吗?

这是未定义的行为。

  

(C11,7.1.4p1)“如果函数的参数具有[...]或类型(在晋升之后),并且具有可变数量的参数的函数不期望,则行为未定义”

为了历史,有一个C缺陷报告(DR#83)解决了这个完全相同的问题:

http://www.open-std.org/jtc1/sc22/wg14/docs/rr/dr_083.html

答案 1 :(得分:0)

printf不是类型安全的。您的责任是参数属于预期类型,否则会发生未定义的行为。

事情更有趣,因为参数的类型是默认提升的:short/char - &gt; intfloat - &gt; double

你的例子是未定义的行为,所以你可以得到任何东西,但是可能发生的事情是,构成实际参数的字节被解释为它们在字符串格式中指定的类型。请注意,float被提升为double%f也有double,可能是8个字节,而int可能是4个字节... < / p>