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() の最初の 2 つの呼び出しは期待どおりに動作しますが、cout ステートメント内で b() を呼び出すと、配列の 2 つの要素がすぐに切り替えられませんが、後で確認すると、既に切り替えられています。

この動作を理解するのを手伝ってもらえますか? ありがとうございました。

4

2 に答える 2

4

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

2 つの関数呼び出しの評価順序は規定されていません。コンパイラはg()thenを呼び出すか、 thenf()を呼び出すことができます。f()g()

あなたのコードでも同じです。a.a[0]コンパイラは callの値を追い払うことも、 を呼び出してから の値を取得するa.b()こともできます。a.b()a.a[0]

于 2013-06-06T02:01:16.643 に答える