为什么 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.2
是 double
)
%f
需要一个 double
,你提供了一个 int
。
所以,你导致了 UB。 只是不要这样做。
只是一个猜测:在您的 ABI 上,浮点参数通过 FPU 堆栈传递,整数通过 CPU-堆栈传递。因此,当 printf 提取参数时,它从 FPU 堆栈中提取 %f
s 并从 CPU-堆栈中弹出 %d
s。如果我是对的,printf("%d %d %d ***** %f %f\n", 1.2 , 2.5, 3000, 400, 500);
应该也适合你。所以浮动和其他(%d、%s & Co)之间的混淆将为你恢复,顺序被保留。无需补充:所有这些都是 >150% UB。
当我运行以下代码时:
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.2
是double
)%f
需要一个double
,你提供了一个int
。
所以,你导致了 UB。 只是不要这样做。
只是一个猜测:在您的 ABI 上,浮点参数通过 FPU 堆栈传递,整数通过 CPU-堆栈传递。因此,当 printf 提取参数时,它从 FPU 堆栈中提取 %f
s 并从 CPU-堆栈中弹出 %d
s。如果我是对的,printf("%d %d %d ***** %f %f\n", 1.2 , 2.5, 3000, 400, 500);
应该也适合你。所以浮动和其他(%d、%s & Co)之间的混淆将为你恢复,顺序被保留。无需补充:所有这些都是 >150% UB。