1

C++11 標準(5.17、expr.ass) は次のように述べています。

いずれの場合も、代入は、右オペランドと左オペランドの値の計算の後、代入式の値の計算の前に順序付けされます。不定順序の関数呼び出しに関しては、複合代入の操作は単一の評価です。

これは、式が次のことを意味します:

int a = 1, b = 10;
int c = (a+=1) + (b+=1);

if ( c == 10+1+1+1 ) {
    printf("this is guaranteed");
} else {
    printf("not guaranteed"); 
}

は常にc==23?と評価されます。

4

3 に答える 3

1

これは常に保証されており、sequenced before ルール (または C++11 より前のシーケンス ポイント ルール) はこれを決定する必要はありません。C++ では、各 (サブ) 式は、生成されたコードで 2 つの重要な効果を持ちます。それは値を持ち (タイプが でない限りvoid)、副作用を持つ可能性があります。シーケンス前/シーケンス ポイント ルールは、副作用が発生したことが保証されるタイミングに影響します。サブ式の値には影響しません。たとえば、あなたの場合、実際の割り当てがいつ行われるかに関係なく、の値は割り当て後に(a += 1)なります。a

C++11 では、 の実際の変更は のa変更の前に行われることが保証されていcます。C++11 より前では、順序に関する保証はありませんでした。ただし、この場合、準拠するプログラムがこの違いを認識できる方法はないため、問題にはなりません。(これはc = (c += 1)、C++11 より前の未定義の動作である のような場合に問題になります。)

于 2013-10-25T10:06:54.387 に答える
1

あなたの例では、加算演算子の優先度が代入演算子の優先度よりも高いため、コンパイラはエラーを発行します。したがって、最初に 1 + b が計算され、次に式 ( 1 + b ) に 1 を代入しようとしますが、( 1 + b ) は左辺値ではありません。

于 2013-10-25T09:27:37.853 に答える