下面的程序输出10.我希望它首先打印0(函数f的else分支)然后打印1.为什么订单被颠倒?
#include <iostream>
using namespace std;
int f(bool& b){
if (b==true){
return 1;
} else {
b=true;
return 0;
}
}
int main () {
bool b=false;
cout<<unitbuf<<f(b)<<unitbuf<<f(b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出
10
Run Code Online (Sandbox Code Playgroud)
未指定对函数的参数的评估顺序.所以,你在左边有这个论点:
(cout << unitbuf << f(b) << unitbuf)
Run Code Online (Sandbox Code Playgroud)
而这一个在右边:
f(b)
Run Code Online (Sandbox Code Playgroud)
两者都被传递给operator<<(最后一个).任何一个都可以先评估.如果首先评估左边的那个,那么左边的调用f(b)将首先发生,然后返回0.然后右边的那个将被调用并返回1,结果输出为01.如果首先评估右边的那个,那么它将返回0,然后将调用左边的那个,返回1,从而产生反向输出10.