当数字的顺序与格式不对应时,为什么printf函数按顺序打印结果?

时间:2017-09-18 15:45:42

标签: c printf format-specifiers

当我运行以下代码时:

printf("%d %f %d %d %f\n", 1.2 , 3000, 2.5, 400, 500);

我认为答案可能是一些毫无意义的数字,但结果实际上是:

3000 1.200000 400 500 2.500000

与我输入的数字和格式相同。

这是非常有意义的,我不能说服自己忽视它。

有人可以告诉我原因吗?我会很感激。

P.S。我正在使用Clion作为我的IDE。

2 个答案:

答案 0 :(得分:7)

为给定的格式说明符提供不合适的类型是undefined behavior,您永远不能“证明”结果。 可能似乎工作正常,但你永远不会知道,在内部它可能会将你所有的钱转移到其他帐户!!

引用C11,章节§7.21.6.1,P9

  

[...]如果有任何论据   不是相应转换规范的正确类型,行为是   未定义。

在你的情况下,

  • %d预计int,您提供了double(文字1.2double
  • %f需要double,您提供了int

所以,你导致UB。 就是不要这样做。

答案 1 :(得分:2)

只是猜测:在ABI浮点上,参数通过FPU堆栈传递,整数通过CPU堆栈。因此,当printf拉出参数时,它会从FPU堆栈中拉出%f并从CPU堆栈中弹出%d s。如果我是对的,printf("%d %d %d ***** %f %f\n", 1.2 , 2.5, 3000, 400, 500);也适合你。因此浮动和其他(%d,%s& Co)之间的混合将为您恢复,订单将被保留。无需添加:所有这些都是> 150%UB。