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());