C printf() 函数的计算顺序?[复制]

C printf() function order of evaluations? [duplicate]

提问人:Thang Tons 提问时间:10/31/2023 最后编辑:AmitThang Tons 更新时间:11/3/2023 访问量:111

问:

输出是什么? 请给出有效的解释。

#include<stdio.h>

int main()
{
    printf("%d %d", printf("Hello World"), printf("New World"));
}

它给予:

New WorldHello World11 9

我不知道为什么它首先打印了“新世界”而不是“Hello World”。请解释输出。

c 函数 输出 printf

评论

3赞 G.M. 10/31/2023
告诉我们的想法,为什么?
1赞 Thang Tons 10/31/2023
它给新世界带来了 Hello World 11 9。我不知道为什么它首先打印了 New World 而不是 Hello World。而在打印时不遵循参数的实际顺序。
3赞 Joel 10/31/2023
在 C 语言中调用函数之前的参数求值顺序
1赞 BoP 10/31/2023
函数调用中的参数值可以按任意顺序计算。
1赞 Weather Vane 10/31/2023
...长度结果仍将以相同的顺序输出,因此它们不一定与可见输出匹配。

答:

0赞 Serge Ballesta 10/31/2023 #1

你首先应该记住,C语言几乎没有什么魔力:它最初被设计成盲目服从它的程序员,现在仍然主要按照它的要求去做。

这里发生的事情是:你用 3 个参数调用函数:一个字符串 () 和 2 个恰好是函数调用的表达式。printf"%d %d"

因此,编译器首先计算函数参数(以未指定的顺序)。每个函数调用都会执行自己的输出,并返回(与任何调用一样)字符数。您首先看到的原因以及由您的特定 C 实现决定的顺序。printfprintfHello worldNew world

然后使用参数调用外部 printf,并且(内部 printf 调用的返回值...)并通常显示 。"%d %d"9119 11

没有魔法......

评论

0赞 Thang Tons 10/31/2023
我仍然不明白打印时输出顺序更改的原因。您能否进一步解释为什么给定的参数顺序没有按应有的方式执行?
3赞 Weijun Zhou 10/31/2023
没有“应该”的说法。参数按未指定的顺序计算。另请参阅@Joel的链接。
2赞 Eric Postpischil 10/31/2023
@ThangTons:没有“应该”评估参数的顺序。C 标准没有规定它们必须按任何特定顺序进行评估。没有任何东西说它们是从左到右评估的。参数甚至根本不需要按顺序计算;编译器可以计算一个参数的一部分,然后是另一个参数的一部分,然后是第一个参数的一部分,依此类推(除了参数本身的排序约束)。例如,可以按 、 、 、 的顺序进行计算。printf("%d %d", f()+g(), h()+i())fihg