考虑这样的操作:
int a = f1(mystream)*f2(mystream)+f3(mystream);
其中f1,f2,f3具有以下形式:
int f(std::istream&)
或
int f(std::ostream&)
我是否保证按此顺序执行f1
,f2
和f3
?
答案 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。某些内置运算符(例如||
和&&
)会引入序列点并导致执行顺序。