我很难理解下面代码中的调用顺序。
我期待看到下面的输出

    A1B2

虽然我看到的输出是
    BA12

我以为std::cout<< b->fooA() << b->fooB() << std::endl调用等同于call
  std::cout.operator<<( b->fooA() ).operator<< ( b->fooB() )

但我可以看到情况并非如此。您能否帮助我更好地了解它的工作方式以及与全局operator<<的关系?这是此顺序中的最后一次调用吗?
#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 );
}

最佳答案

编译器可以按以下方式评估函数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;
}

或标记为1-4的行的许多置换中的某些。您只能保证第1行在第3行之前完成,第2行在第4行之前完成(当然第3行在第4行之前)。 Standard并没有多说,实际上您可以期望使用不同的C++编译器得到不同的结果。

关于c++ - 运算符中的执行顺序<<,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14809978/

10-11 03:12
查看更多