为了在操作者执行的<(order of execution in operator<&l

2019-07-19 17:44发布

我理解在下面的代码调用序列困难。 我原以为会看到下面的输出

    A1B2

虽然我可以看到输出我得到的是

    BA12

我认为通话std::cout<< b->fooA() << b->fooB() << std::endl相当于调用

  std::cout.operator<<( b->fooA() ).operator<< ( b->fooB() )

但我可以看到,这是情况并非如此。 你能帮助我更好地理解如何它的工作原理,并与全球的关系operator<< ? 难道这最后一场在这个序列叫什么?

问候

AFAG

    #include <iostream>

    struct cbase{
        int fooA(){
            std::cout<<"A";
            return 1;
        }
        int fooB(){
            std::cout <<"B";
            return 2;
        }
    };

    void printcbase(cbase* b ){
        std::cout << b->fooA() << b->fooB() << std::endl;
    }

    int main(){
        cbase b;
        printcbase( &b );
    }

Answer 1:

编译器可以评估功能printcbase()是这样的:

void printcbase(cbase* b ){
    int a = b->FooA();    // line 1
    int b = b->FooB();    // line 2
    std::cout << a;       // line 3
    std::cout << b;       // line 4
    stc::cout << std::endl;
}

或一些线路的许多permutatins的标记为1 - 4.你只保证该行1被行4之前的线3,和第2行之前完成(和第4行之前当然线3的)。 标准不说,而且的确可以预期不同的C ++编译器不同的结果。



Answer 2:

的执行顺序<<被很好地定义,但子表达式的计算顺序并不在C ++定义的。 本文以及C代码示例说明了你所提到的问题。

BA12AB12都是正确的。 在下面的代码:

std::cout<< b->fooA() << b->fooB()

1将出现前2 ,但A可能出现之前或之后B ,因为编译器不承诺是否会评估fooAfooB第一。



Answer 3:

移位运算符是左结合; a << b << c读取为(a << b) << c ,这意味着如果a与构件用户定义的类型的operator<< (并返回类型),那么表达式行文a.operator<<(b).operator<<(c) 。 相反,如果一个自由operator<<被使用,那么该读出作为operator<<(operator<<(a, b), c)

因此,评价a << b时的评估之前测序(a << b) << c ,但评价之间没有排序依赖性bc

a << b << c[1]
|         |
a << b[2] |
|    |    c[5]
a[3] b[4]

如果我们数作为上述副作用,则副作用可以被测序的任一者:

54321
53421
45321
43521
43251
35421
34521
34251


文章来源: order of execution in operator<<