C++ 函数调用顺序(C+;+;)

C++ 函数调用顺序(C+;+;),c++,function,sequence,C++,Function,Sequence,我正在写一个类似上面的代码。我想知道的是,在进行乘法运算时,先调用哪个函数?这是因为,第一个调用的函数可以影响从另一个函数返回的结果。我假设先调用函数_1(),当我尝试时,我发现确实如此。然而,情况总是这样吗?这取决于我使用的编译器或系统的工作吗? < P>评估顺序未被C++(或C)标准指定(参见)。如果您的函数_1或函数_2具有显著性,它可能会成为您绝对应该避免的(就像您应该避免的那样)。在某些情况下(具有强优化的内联函数),计算可能是混合的 想想奇怪的案例,比如 result= functi

我正在写一个类似上面的代码。我想知道的是,在进行乘法运算时,先调用哪个函数?这是因为,第一个调用的函数可以影响从另一个函数返回的结果。我假设先调用
函数_1()
,当我尝试时,我发现确实如此。然而,情况总是这样吗?这取决于我使用的编译器或系统的工作吗?

< P>评估顺序未被C++(或C)标准指定(参见)。如果您的
函数_1
函数_2
具有显著性,它可能会成为您绝对应该避免的(就像您应该避免的那样)。在某些情况下(具有强优化的内联函数),计算可能是混合的

想想奇怪的案例,比如

result= function_1()*function_2();
它可能是特定于实现的,并且可能取决于实际的编译器和标志

您应该将函数调用的顺序视为完全随机且不可复制(即使在实践中它可能是可复制的)。同样,您也不应该期望任何特定的参数顺序求值(例如,在
f(i++,++j)
中,您不知道
i
j
是否先递增),即使对于给定的编译器,该顺序可能是固定的。同样,您应该想象一个完全随机且不可复制的顺序

正如所评论的,如果您关心顺序,那么应该显式地编写一些代码


最后,如果你的代码依赖于某个顺序,它完全是不可读的,对于这种简单的可读性,你应该避免这样编码。

< P>根据C++标准(1.9程序执行)

15除非另有说明,否则对单个运算符的操作数进行求值 单个表达式的子表达式的和是不排序的

所以在这个表达式中

 static int i;
 int function_1(void) { i++; return i; }
 int function_2(void) { i+=2; return 3*i+1; }
一些编译器可以先计算函数_1(),然后计算函数_2(),而其他编译器可以先计算函数_2(),然后计算函数_1()。即使你写得像

result= function_1()*function_2();


相对于操作数的求值顺序,不会更改任何内容。

如果需要,需要在函数调用之间插入一个序列点。像
result=function_1();结果*=函数_2()。这不会导致未定义的行为(除非
function\u 1
function\u 2
是宏)。函数体前后都有一个序列点。如果
function_1
function_2
是内联的,我相信编译器可能会优化以混合这两个代码…它仍然不能导致UB,编译器必须遵守规则“This is unspecified”(这是未指定的)太模糊。听起来好像C++标准没有对此表示任何意见。但确实如此。它指定未指定评估顺序。因此,更准确的说法是“子表达式的求值顺序未指定”。
result= (function_1())*(function_2());
result= (function_1())*function_2();
result= function_1()*(function_2());