# 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
谁能解释上述输出的行为?我知道使用不同的覆盖规范是愚蠢的,但我只是为了理论上的目的。
# 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
谁能解释上述输出的行为?我知道使用不同的覆盖规范是愚蠢的,但我只是为了理论上的目的。
谁能解释上述输出的行为?
这是未定义的行为。
(C11,7.1.4p1)“如果函数的参数具有 [...] 或具有可变数量参数的函数不期望的类型(提升后),则行为未定义”
为了历史起见,有一个 C 缺陷报告 (DR#83) 解决了这个完全相同的问题:
printf
不是类型安全的。参数是预期类型是您的责任,否则会发生未定义的行为。
事情更有趣,因为参数的类型是默认提升的:short/char
-> int
,float
-> double
。
您的示例是未定义的行为,因此您可以得到任何东西,但在幕后可能发生的情况是,构成实际参数的字节被解释为它们在字符串格式中指定的类型的位置。请注意,它float
被提升double
并%f
指定为 a double
,它可能是 8 个字节,而int
可能是 4 个字节......