通话顺序和副作用

时间:2013-05-14 20:48:03

标签: c++ stream operators operator-precedence

考虑这样的操作:

int a = f1(mystream)*f2(mystream)+f3(mystream);

其中f1,f2,f3具有以下形式:

int f(std::istream&)

int f(std::ostream&)

我是否保证按此顺序执行f1f2f3

3 个答案:

答案 0 :(得分:4)

没有。各个子表达式不相互排序。保证的是任何一个函数调用在另一个函数调用开始之前完成,但三个函数调用的顺序是不确定的。

答案 1 :(得分:0)

您无法保证每个编译器都使用左右订单。因此,如果您不确定可以在汇编代码中查找它。一旦编译器创建了汇编代码,就可以保证订单。 看看下面的汇编代码:

cout << f1() * f2() * f3();
00C6452E  call        f1 (0C61096h)  
00C64533  mov         esi,eax  
00C64535  call        f2 (0C6112Ch)  
00C6453A  imul        esi,eax  
00C6453D  call        f3 (0C61127h) 
00C64542  imul        esi,eax  
00C64545  mov         edi,esp 

这是我的编译器创建的代码......

答案 2 :(得分:0)

不,它们可以按任何顺序执行。这是因为内置的*+运算符不会引入sequence point。某些内置运算符(例如||&&)会引入序列点并导致执行顺序。