3

我正在学习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() 时,它不会立即切换数组的两个元素,但后来我检查它,它已经切换了。

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

4

2 回答 2

4

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

两个函数调用的求值顺序未指定;编译器可以调用g()then f(),也可以调用f()then g()

您的代码中的相同内容;编译器可以隐藏a.a[0]调用的值a.b(),或者它可以调用a.b()然后获取a.a[0].

于 2013-06-06T02:01:16.643 回答
0

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

在单独的行中调用这些以排除歧义会更安全。

于 2020-04-10T19:26:12.480 回答