众所周知,函数参数的评估顺序未指定,并且可能因不同的编译器而不同。
在以下意义上,函数调用是否可以交错似乎不太清楚:
f(g(h()), i(j()))
让我们假设编译器首先选择评估f的第一个参数。编辑是否可以在致电j
和h
之间致电g
?我相信,但我不知道在标准中哪里可以找到确认。
答案 0 :(得分:13)
评估订单未指定 - 参见标准的第5.2.2 / 8节:
参数的评估顺序 没有具体说明。所有的副作用 参数表达式评估 输入功能前的效果。
答案 1 :(得分:3)
我不知道标准说的是什么,但我认为如果它对你很重要,那么你应该重新安排代码,以便你知道将以什么顺序发生什么(临时变量是你的朋友) 。即使你弄明白标准是什么,如果我们假设你的编译器正确地实现了这一点,那么你仍然会留下一个维护定时炸弹,因为你的继任者不会知道你所做的一切。
答案 2 :(得分:2)
标准未指定评估顺序。它仅取决于您的编译器。
答案 3 :(得分:0)
如果你在同一个表达式中使用的函数以某种方式相关(一个影响另一个的结果),那么不同的调用顺序会产生不同的结果,然后不要在表达式中使用嵌套函数。
我这样做是好的做法,正因为,正如另一个所说,调用顺序是未定义的(如果优化器认为它会更优化,你甚至可以进行隔行执行)。