18

以下が C++ でコンパイルされるのはなぜですか?

int phew = 53;
++++++++++phew ;

同じコードが C で失敗するのはなぜですか?

4

2 に答える 2

31

注: 2 つの障害レポートDR#637DR#222は、以下の動作原理を理解するために重要です。


説明のために、C++0x にはvalue computationsとがありside effectsます。たとえば、副作用は代入であり、値の計算は、左辺値が参照するものを決定するか、左辺値から値を読み取ることです。C++0x にはシーケンス ポイントがなくなり、この内容は「前にシーケンスされた」/「後にシーケンスされた」という用語で表現されていることに注意してください。そして、次のように述べられています

スカラー オブジェクトに対する副作用が、同じスカラー オブジェクトに対する別の副作用、または同じスカラー オブジェクトの値を使用した値の計算に対して順序付けされていない場合、動作は未定義です。

++vは、と同等v += 1ですv = v + 1(ただし、v は 1 回だけ評価されます)。これは、 の左辺値の結果を指す++ (v = v + 1)として記述します。inc = inc + 1incv = v + 1

C++0x では、代入は b と a の値の計算の後、代入式の値の計算の前に++ ++v順序付けられるため、未定義の動作ではありません。の代入は の値計算の前にa = b順序付けられることになります。の代入は、 の値計算の後に並べられます。最終的に、両方の割り当てが順序付けられ、未定義の動作はありません。v = v + 1incinc = inc + 1inc

于 2010-09-11T15:04:24.393 に答える
15

これは、C++プリインクリメント演算子が を返しlvalueそのオペランドが である必要があるためlvalueです。

++++++++++phew ;として解釈されます++(++(++(++(++phew))))

ただし、2 つのシーケンス ポイント間で複数回Undefined Behaviourの値を変更しようとしているため、コードが呼び出されます。phew

ではC、プリインクリメント演算子は を返しrvalueそのオペランドが である必要がありlvalueます。したがって、コードは C モードでコンパイルされません。

于 2010-09-11T07:07:15.650 に答える