考虑这样的操作:
int a = f1(mystream)*f2(mystream)+f3(mystream);
其中 f1、f2、f3 具有以下形式:
int f(std::istream&)
或者
int f(std::ostream&)
我有保证f1
,f2
并且f3
会按那个顺序执行吗?
考虑这样的操作:
int a = f1(mystream)*f2(mystream)+f3(mystream);
其中 f1、f2、f3 具有以下形式:
int f(std::istream&)
或者
int f(std::ostream&)
我有保证f1
,f2
并且f3
会按那个顺序执行吗?
不,各个子表达式之间没有相互排序。保证的是任何一个函数调用在另一个函数调用之前完成,但是三个函数调用的顺序是不确定的。
不,它们可以按任何顺序执行。这是因为内置的*
和+
运算符没有引入序列点。一些内置运算符,例如||
and&&
确实引入了序列点并导致定义执行顺序。
您不能保证每个编译器都使用左右顺序。所以如果你不确定你可以在你的汇编代码中查找它。一旦编译器创建了汇编代码,就可以保证顺序。看看下面的汇编代码:
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
这是我的编译器创建的代码...