函数调用序列(C++)

oic*_*sah 3 c++ function sequence

result= function_1()*function_2();
Run Code Online (Sandbox Code Playgroud)

我正在写一个像上面这样的代码.我想知道的是在进行乘法时,首先调用哪个函数?这是因为,第一个被调用的函数可以影响从另一个函数返回的结果.我假设function_1()首先被召唤,当我尝试时,我看到它真的如此.但是,总是如此吗?是否取决于我使用的编译器或我使用的系统?

Bas*_*tch 9

C++(或C)标准未指定评估顺序(参见Vlad的回答).如果您有function_1function_2有明显的副作用,它可能会成为您应该绝对避免的一些未指明的行为(就像您应该避免未定义的行为).在某些情况下(具有强大优化功能的内联函数),计算可能会混杂在一起.

想想像奇怪的情况

 static int i;
 int function_1(void) { i++; return i; }
 int function_2(void) { i+=2; return 3*i+1; }
Run Code Online (Sandbox Code Playgroud)

它可能是特定于实现的,可能取决于实际的编译器和优化标志.

您应该编写代码,好像函数调用的顺序是完全随机的并且不可重现(即使在实践中它可能是可重现的).同样,您不应该期望任何特定的参数评估顺序(例如,f(i++, ++j)您不知道是否已经i或者j已经增加),即使对于给定的编译器,该订单可能是固定的.同样,您应该想象一个完全随机且不可重现的顺序.

正如David Schwartz评论的那样,如果您关心订单,则应该明确编写一些序列点

最后,如果您的代码依赖于某些顺序,则它完全不可读,并且出于简单的可读性原因,您应该避免以这种方式编码.

  • 如果您在意,则需要在函数调用之间插入一个序列点.比如`result = function_1(); 结果*= function_2();`. (5认同)
  • "这是未指明的"太模糊了.听起来像C++标准没有说明这一点.但确实如此.它指定未指定评估顺序.因此,更准确的说法是"子表达式的评估顺序未指定". (2认同)