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