0
main(){
  printf("%d %d",1234.5);
}

输出:0 1083394560

这是默认参数提升的情况,其中浮点变量被视为双精度,然后首先%d显示 0,另一个显示其余 4 个字节的值,即 1083394560。

我的问题是如果%d读取前 4 个字节,那么这个程序如何

main()
{
  printf("%f",1234.5);
}

给出正确的输出。因为 float 也是 4 个字节,所以它的行为也应该像%d.

4

3 回答 3

1

%f格式字符串在参数列表中获取一个值double,并将其打印出来。由于无后缀的浮点文字double在 C 中是 s,并且默认提升规则不会提升或以其他方式更改双精度数,因此您的第二个示例根本不会发生任何魔法。

您的第一个示例是未定义的行为,任何事情都可能发生。

C99 §7.19.6.1函数fprintf

如果格式的参数不足,则行为未定义。

[...]

如果任何参数不是相应转换规范的正确类型,则行为未定义。

于 2012-05-18T06:48:20.103 回答
1

嗯?%f可以“知道”float作为 vararg 参数传递的 a 已被提升为更大的 ( double) 并相应地采取行动,当然。的代码%d不知道它应该期待提升的浮点值;它期望一个(适当提升)int

于 2012-05-18T06:34:01.717 回答
0

你自己回答你的问题:

这是默认参数提升的情况,其中浮点变量被视为双精度

当然,%f知道这个默认参数提升并且只处理doubles,而不处理floats。

于 2012-05-18T07:13:13.870 回答