c – 在operator <<中执行的顺序

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

A1B2

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

BA12

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

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

但我可以看到情况并非如此.你能帮助我更好地理解它是如何工作的以及与全球操作符的关系<<?这是最后一次调用这个序列吗? 问候 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 );
    }

解决方法

编译器可以像这样评估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行之前完成(当然第4行在第4行之前).标准没有说更多,实际上你可以期望使用不同的C编译器得到不同的结果.

相关文章

一.C语言中的static关键字 在C语言中,static可以用来修饰局...
浅谈C/C++中的指针和数组(二) 前面已经讨论了指针...
浅谈C/C++中的指针和数组(一)指针是C/C++...
从两个例子分析C语言的声明 在读《C专家编程》一书的第三章时...
C语言文件操作解析(一)在讨论C语言文件操作之前,先了解一下...
C语言文件操作解析(三) 在前面已经讨论了文件打开操作,下面...