在下面的表达式中是否有一些确定的函数调用顺序,或者它是否因编译器而异?
此处的规则是否适用 - 在C中,未指定大多数运算符的函数和操作数的参数的计数顺序.在此Wiki页面中找到了上述规则
a = (f1(10, 20) * f2(30, 40)) + f3()
Run Code Online (Sandbox Code Playgroud)
该规则确实适用.f1,, f2和f3可以按任何顺序进行评估.
要扩大一些混乱位(因为人们总是张贴错误的答案),运算符优先级并不会影响其事情的顺序进行评估.举个例子:
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()并完成计算.
在这些情况中的每一种情况下(或评估顺序的任何其他排列),功能以不同的顺序进行评估,但是实现了相同的答案.
总结:运算符优先级确定解析树,而不是评估顺序.未指定评估解析树的顺序.
| 归档时间: |
|
| 查看次数: |
163 次 |
| 最近记录: |