# 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
有人能解释上述输出的行为吗? 我知道使用不同的转换规范是愚蠢的,但我只是要求理论上的目的。
答案 0 :(得分:2)
有人可以解释上述输出的行为吗?
这是未定义的行为。
(C11,7.1.4p1)“如果函数的参数具有[...]或类型(在晋升之后),并且具有可变数量的参数的函数不期望,则行为未定义”
为了历史,有一个C缺陷报告(DR#83)解决了这个完全相同的问题:
答案 1 :(得分:0)
printf
不是类型安全的。您的责任是参数属于预期类型,否则会发生未定义的行为。
事情更有趣,因为参数的类型是默认提升的:short/char
- &gt; int
,float
- &gt; double
。
你的例子是未定义的行为,所以你可以得到任何东西,但是可能发生的事情是,构成实际参数的字节被解释为它们在字符串格式中指定的类型。请注意,float
被提升为double
,%f
也有double
,可能是8个字节,而int
可能是4个字节... < / p>