<分区>
在下面的表达式中调用函数是否有某种明确的顺序,或者它是否因编译器而异?
以下规则是否适用于此 - 在 C 语言中,大多数运算符的函数参数和操作数的求值顺序是未指定的。在这个wiki page中找到了上面的规则
a = (f1(10, 20) * f2(30, 40)) + f3()
标签 c function-calls
<分区>
在下面的表达式中调用函数是否有某种明确的顺序,或者它是否因编译器而异?
以下规则是否适用于此 - 在 C 语言中,大多数运算符的函数参数和操作数的求值顺序是未指定的。在这个wiki page中找到了上面的规则
a = (f1(10, 20) * f2(30, 40)) + f3()
最佳答案
规则确实适用。 f1
、f2
和 f3
可以按任何顺序求值。
为了进一步说明一些混淆(因为人们不断发布错误答案),运算符优先级不会影响事物被评估的顺序 。举个例子:
f1() * f2() + f3()
现在,我们知道是的,f1()
和f2()
的结果相乘,然后与f3() 的结果相加
,但我们不知道求值顺序。解析树如下所示:
+
/ \
* f3()
/ \
f1() f2()
但是我们不知道 +
的左边还是右边会先被计算。它可能是任何一种方式。与 *
相同:我们不知道它的左侧还是右侧会先被评估。
编译器可以调用 f3()
,然后存储结果,然后调用 f2()
,存储该结果,然后调用 f1()
,然后使用存储的结果执行实际计算。
或者,或者,它可以调用 f1()
,存储结果,然后调用 f2()
,然后使用两个值相乘(然后存储结果),然后调用 f3()
并完成计算。
在每一种情况下(或任何其他求值顺序的排列),函数的求值顺序不同,但得到的答案相同。
总而言之:运算符优先级决定解析树,而不是求值顺序。未指定分析树的评估顺序。
关于c - 将调用哪些订单函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20756139/