c - 将调用哪些订单函数

标签 c function-calls

<分区>

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

以下规则是否适用于此 - 在 C 语言中,大多数运算符的函数参数和操作数的求值顺序是未指定的。在这个wiki page中找到了上面的规则

a = (f1(10, 20) * f2(30, 40)) + f3()

最佳答案

规则确实适用。 f1f2f3 可以按任何顺序求值。

为了进一步说明一些混淆(因为人们不断发布错误答案),运算符优先级不会影响事物被评估的顺序 。举个例子:

f1() * f2() + f3()

现在,我们知道是的,f1()f2() 的结果相乘,然后与f3() 的结果相加,但我们不知道求值顺序。解析树如下所示:

        +
      /   \
     *    f3()
   /   \
f1()   f2()

但是我们不知道 + 的左边还是右边会先被计算。它可能是任何一种方式。与 * 相同:我们不知道它的左侧还是右侧会先被评估。

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

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

在每一种情况下(或任何其他求值顺序的排列),函数的求值顺序不同,但得到的答案相同。

总而言之:运算符优先级决定解析树,而不是求值顺序。未指定分析树的评估顺序。

关于c - 将调用哪些订单函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20756139/

相关文章:

c - #define ArrayLength(x) (sizeof(x)/sizeof(*(x))) 是什么意思?

无法在 Windows 7 x64 上编译 C

C++ 将 void* 转换为 int 错误

c - realloc函数的使用

c - 外部变量和全局变量

c++ - 我在这里遗漏了一些简单的东西(运行时执行优先级?)

javascript - 将 'new' 构造函数“绑定(bind)”到 Javascript 中的函数

c - 用于从 c 文件中提取函数调用的 Bash 脚本

node.js - 调用错误优先功能Node JS

python "Function call with parameter: Converting measurements?"