cout语句中的c ++函数调用

时间:2013-06-06 01:56:42

标签: c++

我正在学习c ++,最近遇到了一个令人困惑的问题,这是代码:

#include <iostream>

using namespace std;

class A {
    public:
        A() { a[0] = 1; a[1] = 0; }
        int a[2];
        int b(void) { int x=a[0];a[0]=a[1];a[1]=x; return x; }
};

int main(void) {
    A a;
    cout<<a.a[0]<<a.a[1]<<endl; //outputs 10
    a.b();
    cout<<a.a[0]<<a.a[1]<<endl; //outputs 01
    a.b();
    cout<<a.a[0]<<a.a[1]<<endl; //outputs 10

    cout << a.b() << //outputs 1
    endl<< a.a[0]<<a.a[1] << endl; //outputs 10???

    cout<<a.a[0]<<a.a[1]<<endl; //outputs 01???
    return 0;
}

b()的前两个调用按预期运行,但是当我在cout语句中调用b()时,它不会立即切换数组的两个元素,但稍后我检查它,它已经切换。

你可以帮我理解这种行为吗?谢谢。

2 个答案:

答案 0 :(得分:4)

std::cout << f() << g();

未指定两个函数调用的评估顺序;编译器可以调用g()然后调用f(),也可以调用f()然后调用g()

代码中的内容相同;编译器可以将调用a.a[0] a.b()的价值缩小,或者调用a.b()然后获取a.a[0]的值。

答案 1 :(得分:0)

表达式中的函数求值取决于编译器流操作,例如<<>>。评估x = f1() + f2()时会发生相同的问题。您不知道将首先评估哪个,因为它取决于编译器。

在单独的行上调用它们以消除歧义会更安全。