-1

公式のC++標準によると、異なるコンパイラで実行した場合に次の単純なコードの出力に違いがある理由を誰かが説明できますか?

言い換えれば、標準では、最初に何が起こるか、a ++またはb割り当てに関して、これを開いたままにしますか?

これは関数パラメーターとは関係ありません。異なるコンパイラーで実行される同じコードです。サンプルコードは次のとおりです。

#include <iostream>
using namespace std;

int main() {
    int a = 10, b;

    a = b = a+++a;
    cout << "a = " << a << ", b = " << b;

return 0;
}

コードのリンクはこちらです。

g++4.7.2およびIntelC++ 13.0.1を使用すると、次のようになります。

stdout:
a = 21, b = 20

g++4.8.0およびClang++3.2では、次のようになります。

stdout:
a = 21, b = 21

どちらが正しいですか?ありがとう。

4

1 に答える 1

1

すべてのコンパイラは正しいです。

ラインで

a = b = a+++a;

間にシーケンス ポイントがなくても 2 回変更されるため、Undefined Behaviorを呼び出します。これを行うと、C++ 標準は、コンパイラが好きなことを行うライセンスをコンパイラに与えます。a

于 2013-02-14T13:27:10.897 に答える