为什么 printf 函数在数字顺序与格式不对应的情况下按顺序打印结果?

Why printf function print the result in order when the order of number is not corresponding to the format?

当我运行以下代码时:

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.

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

引用 C11,章节 §7.21.6.1,P9

[...] If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.

在你的情况下,

  • %d 期望 int,你提供了 double(字面上的 1.2double
  • %f 需要一个 double,你提供了一个 int

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

只是一个猜测:在您的 ABI 上,浮点参数通过 FPU 堆栈传递,整数通过 CPU-堆栈传递。因此,当 printf 提取参数时,它从 FPU 堆栈中提取 %fs 并从 CPU-堆栈中弹出 %ds。如果我是对的,printf("%d %d %d ***** %f %f\n", 1.2 , 2.5, 3000, 400, 500); 应该也适合你。所以浮动和其他(%d、%s & Co)之间的混淆将为你恢复,顺序被保留。无需补充:所有这些都是 >150% UB。