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知道这个默认参数提升并且只处理doubles,而不处理floats。