默认参数提升

时间:2012-05-18 06:30:43

标签: c

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

3 个答案:

答案 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。