嵌套函数调用评估顺序

时间:2009-05-07 10:27:20

标签: c++

众所周知,函数参数的评估顺序未指定,并且可能因不同的编译器而不同。

在以下意义上,函数调用是否可以交错似乎不太清楚:

f(g(h()), i(j()))

让我们假设编译器首先选择评估f的第一个参数。编辑是否可以在致电jh之间致电g?我相信,但我不知道在标准中哪里可以找到确认。

4 个答案:

答案 0 :(得分:13)

评估订单未指定 - 参见标准的第5.2.2 / 8节:

  

参数的评估顺序   没有具体说明。所有的副作用   参数表达式评估   输入功能前的效果。

答案 1 :(得分:3)

我不知道标准说的是什么,但我认为如果它对你很重要,那么你应该重新安排代码,以便你知道将以什么顺序发生什么(临时变量是你的朋友) 。即使你弄明白标准是什么,如果我们假设你的编译器正确地实现了这一点,那么你仍然会留下一个维护定时炸弹,因为你的继任者不会知道你所做的一切。

答案 2 :(得分:2)

标准未指定评估顺序。它仅取决于您的编译器。

答案 3 :(得分:0)

如果你在同一个表达式中使用的函数以某种方式相关(一个影响另一个的结果),那么不同的调用顺序会产生不同的结果,然后不要在表达式中使用嵌套函数。

我这样做是好的做法,正因为,正如另一个所说,调用顺序是未定义的(如果优化器认为它会更优化,你甚至可以进行隔行执行)。