1

考虑这样的操作:

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

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

int f(std::istream&)

或者

int f(std::ostream&)

我有保证f1f2并且f3会按那个顺序执行吗?

4

3 回答 3

4

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

于 2013-05-14T20:53:20.647 回答
0

不,它们可以按任何顺序执行。这是因为内置的*+运算符没有引入序列点。一些内置运算符,例如||and&&确实引入了序列点并导致定义执行顺序。

于 2013-05-14T21:17:21.100 回答
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 

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

于 2013-05-14T21:04:25.037 回答