使用std :: cout时的反向顺序

Sla*_*zer 0 c++ cout

下面的程序输出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)

Ben*_*ley 5

未指定对函数的参数的评估顺序.所以,你在左边有这个论点:

(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.