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

时间:2013-08-07 02:43:18

标签: 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;
}

输出

10

1 个答案:

答案 0 :(得分:5)

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

(cout << unitbuf << f(b) << unitbuf)

这一个在右边:

f(b)

两者都传递给operator<<(最后一个)。任何一个都可以先评估。如果首先评估左边的那个,那么左边的f(b)的调用将首先发生,然后返回0.然后右边的那个将被调用并返回1,导致输出{{ 1}}。如果首先评估右边的那个,那么 it 将返回0,然后将调用左边的那个,返回1,导致01的反转输出。 / p>