result= function_1()*function_2();
我在写上面的代码。我想知道的是在进行乘法运算时,哪个函数首先被调用?这是因为,第一个被调用函数可以影响从另一个函数返回的结果。我认为function_1()
被称为第一,当我尝试时,我看到它是真的如此。但是,情况总是如此吗?它取决于我使用的编译器还是我工作的系统?函数调用的顺序(C++)
result= function_1()*function_2();
我在写上面的代码。我想知道的是在进行乘法运算时,哪个函数首先被调用?这是因为,第一个被调用函数可以影响从另一个函数返回的结果。我认为function_1()
被称为第一,当我尝试时,我看到它是真的如此。但是,情况总是如此吗?它取决于我使用的编译器还是我工作的系统?函数调用的顺序(C++)
评估顺序未由C++(或C)标准规定(请参阅answer from Vlad)。如果你的function_1
或function_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)
中,您不知道i
或j
是否先增加过),即使对于给定的编译器,该顺序可能是固定的。再一次,你应该想象一个完全随机的,不可重复的命令。
正如评论说David Schwartz,如果你关心的顺序,你应该在代码明确一些sequence points
最后,如果你的代码是根据一些秩序,它是完全不可读并为简单易读的原因,你应该避免用这种方式编码。
根据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());
什么也不会相对于操作数的计算顺序改变。
如果你在意,你需要在函数调用之间插入一个序列点。像'result = function_1();结果* = function_2();'。 – 2014-10-29 09:15:43
这不会导致未定义的行为(除非'function_1'或'function_2'是宏)。函数体之前和之后都有一个序列点。 – 2014-10-29 09:20:02
如果'function_1'和'function_2'是内联的,我相信编译器可能会优化混合这两个代码... – 2014-10-29 09:22:37