将调用哪些订单功能

rgk*_*rgk 3 c function-calls

在下面的表达式中是否有一些确定的函数调用顺序,或者它是否因编译器而异?

此处的规则是否适用 - 在C中,未指定大多数运算符的函数和操作数的参数的计数顺序.在此Wiki页面中找到了上述规则

a = (f1(10, 20) * f2(30, 40)) + f3()
Run Code Online (Sandbox Code Playgroud)

Cor*_*lks 8

该规则确实适用.f1,, f2f3可以按任何顺序进行评估.

要扩大一些混乱位(因为人们总是张贴错误的答案),运算符优先级并不会影响其事情的顺序进行评估.举个例子:

f1() * f2() + f3()
Run Code Online (Sandbox Code Playgroud)

现在,我们知道是的,结果f1()f2()成倍增加,然后加到结果中f3(),但我们不知道评估顺序.解析树看起来像这样:

        +
      /   \
     *    f3()
   /   \
f1()   f2()
Run Code Online (Sandbox Code Playgroud)

但我们不知道是否+会先评估左侧或右侧.它可能是两种方式.同样*:我们不知道它的左侧或右侧是否会被评估.

编译器可以调用f3(),然后存储结果,然后调用f2(),存储该结果,然后调用f1(),然后使用存储的结果执行实际计算.

或者,它可以调用f1(),存储结果,然后调用f2(),然后使用这两个值相乘(然后存储该结果),然后调用f3()并完成计算.

在这些情况中的每一种情况下(或评估顺序的任何其他排列),功能以不同的顺序进行评估,但是实现了相同的答案.

总结:运算符优先级确定解析树,而不是评估顺序.未指定评估解析树的顺序.