main(){
printf("%d %d",1234.5);
}
输出:0 1083394560
这是默认参数提升的情况,其中浮点变量被视为双精度,然后首先%d
显示 0,另一个显示其余 4 个字节的值,即 1083394560。
我的问题是如果%d
读取前 4 个字节,那么这个程序如何
main()
{
printf("%f",1234.5);
}
给出正确的输出。因为 float 也是 4 个字节,所以它的行为也应该像%d
.
main(){
printf("%d %d",1234.5);
}
输出:0 1083394560
这是默认参数提升的情况,其中浮点变量被视为双精度,然后首先%d
显示 0,另一个显示其余 4 个字节的值,即 1083394560。
我的问题是如果%d
读取前 4 个字节,那么这个程序如何
main()
{
printf("%f",1234.5);
}
给出正确的输出。因为 float 也是 4 个字节,所以它的行为也应该像%d
.
%f
格式字符串在参数列表中获取一个值double
,并将其打印出来。由于无后缀的浮点文字double
在 C 中是 s,并且默认提升规则不会提升或以其他方式更改双精度数,因此您的第二个示例根本不会发生任何魔法。
您的第一个示例是未定义的行为,任何事情都可能发生。
C99 §7.19.6.1函数fprintf
如果格式的参数不足,则行为未定义。
[...]
如果任何参数不是相应转换规范的正确类型,则行为未定义。
嗯?%f
可以“知道”float
作为 vararg 参数传递的 a 已被提升为更大的 ( double
) 并相应地采取行动,当然。的代码%d
不知道它应该期待提升的浮点值;它期望一个(适当提升)int
。
你自己回答你的问题:
这是默认参数提升的情况,其中浮点变量被视为双精度
当然,%f
知道这个默认参数提升并且只处理double
s,而不处理float
s。