当我运行以下代码时:
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。
答案 0 :(得分:7)
为给定的格式说明符提供不合适的类型是undefined behavior,您永远不能“证明”结果。 可能似乎工作正常,但你永远不会知道,在内部它可能会将你所有的钱转移到其他帐户!!
引用C11
,章节§7.21.6.1,P9
[...]如果有任何论据 不是相应转换规范的正确类型,行为是 未定义。
在你的情况下,
%d
预计int
,您提供了double
(文字1.2
是double
)%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。