以下が C++ でコンパイルされるのはなぜですか?
int phew = 53;
++++++++++phew ;
同じコードが C で失敗するのはなぜですか?
以下が C++ でコンパイルされるのはなぜですか?
int phew = 53;
++++++++++phew ;
同じコードが C で失敗するのはなぜですか?
注: 2 つの障害レポートDR#637とDR#222は、以下の動作原理を理解するために重要です。
説明のために、C++0x にはvalue computations
とがありside effects
ます。たとえば、副作用は代入であり、値の計算は、左辺値が参照するものを決定するか、左辺値から値を読み取ることです。C++0x にはシーケンス ポイントがなくなり、この内容は「前にシーケンスされた」/「後にシーケンスされた」という用語で表現されていることに注意してください。そして、次のように述べられています
スカラー オブジェクトに対する副作用が、同じスカラー オブジェクトに対する別の副作用、または同じスカラー オブジェクトの値を使用した値の計算に対して順序付けされていない場合、動作は未定義です。
++v
は、と同等v += 1
ですv = v + 1
(ただし、v は 1 回だけ評価されます)。これは、 の左辺値の結果を指す++ (v = v + 1)
として記述します。inc = inc + 1
inc
v = v + 1
C++0x では、代入は b と a の値の計算の後、代入式の値の計算の前に++ ++v
順序付けられるため、未定義の動作ではありません。の代入は の値計算の前にa = b
順序付けられることになります。の代入は、 の値計算の後に並べられます。最終的に、両方の割り当てが順序付けられ、未定義の動作はありません。v = v + 1
inc
inc = inc + 1
inc
これは、C++
プリインクリメント演算子が を返し、lvalue
そのオペランドが である必要があるためlvalue
です。
++++++++++phew ;
として解釈されます++(++(++(++(++phew))))
ただし、2 つのシーケンス ポイント間で複数回Undefined Behaviour
の値を変更しようとしているため、コードが呼び出されます。phew
ではC
、プリインクリメント演算子は を返し、rvalue
そのオペランドが である必要がありlvalue
ます。したがって、コードは C モードでコンパイルされません。