2014-10-29 39 views
3
result= function_1()*function_2(); 

我在写上面的代码。我想知道的是在进行乘法运算时,哪个函数首先被调用?这是因为,第一个被调用函数可以影响从另一个函数返回的结果。我认为function_1()被称为第一,当我尝试时,我看到它是真的如此。但是,情况总是如此吗?它取决于我使用的编译器还是我工作的系统?函数调用的顺序(C++)

回答

9

评估顺序未由C++(或C)标准规定(请参阅answer from Vlad)。如果你的function_1function_2有重要的side-effects,它可能会变成你应该绝对避免的一些unspecified behavior(如你应该避免undefined behavior)。在某些情况下(强优化的内联函数)计算可能会混杂在一起。

想想怪异的情况下,像

static int i; 
int function_1(void) { i++; return i; } 
int function_2(void) { i+=2; return 3*i+1; } 

这可能是实现特定的,并且可能取决于实际的编译器和optimization标志。

您应该按照函数调用顺序完全随机且不可重现的方式进行编码(即使在实践中它可能是可重现的)。同样,您不应该期望评估参数的任何特定顺序(例如,在f(i++, ++j)中,您不知道ij是否先增加过),即使对于给定的编译器,该顺序可能是固定的。再一次,你应该想象一个完全随机的,不可重复的命令。

正如评论说David Schwartz,如果你关心的顺序,你应该在代码明确一些sequence points

最后,如果你的代码是根据一些秩序,它是完全不可读并为简单易读的原因,你应该避免用这种方式编码。

+5

如果你在意,你需要在函数调用之间插入一个序列点。像'result = function_1();结果* = function_2();'。 – 2014-10-29 09:15:43

+1

这不会导致未定义的行为(除非'function_1'或'function_2'是宏)。函数体之前和之后都有一个序列点。 – 2014-10-29 09:20:02

+0

如果'function_1'和'function_2'是内联的,我相信编译器可能会优化混合这两个代码... – 2014-10-29 09:22:37

4

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

15除非另有说明,个体经营者 的和个别表达式子表达式的操作数的评价是未测序。因此,在这个表达式

result= function_1()*function_2(); 

一些编译器可以在第一function_1(),然后function_2(),而其他的编译器可在第一function_2(),然后才function_1评价()评价。即使你写这样

result= (function_1())*(function_2()); 

result= (function_1())*function_2(); 

result= function_1()*(function_2()); 

什么也不会相对于操作数的计算顺序改变。