3

++a = b操作はエラーを表示していませんが、a++ = bでコンパイル中にエラーを表示していg++ます。両方の変数は、これらの操作の前に初期化されます。

これらの操作には実際的な使用法はありませんが、コンパイル中に両方とも同じエラーが発生するはずです。どう思いますか?正当な理由がある場合は、親切に説明してください。前もって感謝します!:)

PSgccはこれらの両方でエラーを出します。

4

4 に答える 4

8

pre/post-increment の宣言がどのように見えるか見てみましょう ( http://en.cppreference.com/w/cpp/language/operator_incdec ):

++a: T& operator ++(T& a);
a++: T operator ++(T& a, int);

答えはわかりました。preInc は参照を返すので、「=」演算子を使用して「a」変数をオーバーライドできます。

于 2012-09-11T08:39:26.457 に答える
6

結果++aLvalueですが、結果はa++Rvalueです。 Rvalueに何も割り当てることができないため、エラーが発生します。

違いは、(少し単純化すると) Lvalueは何らかのオブジェクトを参照する式であるのに対し、Rvalueはメモリ内のどこかに格納されたデータを参照することです。

a++の結果が であるとしましょう7。基本的に、書くときは、明らかに不可能なa++ = b;割り当てbを試みています。一方、7と書くと、インクリメントの結果はを参照する左辺値になるので、代入は有効になります。++a = b;a

左辺値右辺値 の詳細については、こちらを参照してください。

于 2012-09-11T08:31:30.233 に答える
3

++a左辺値(インクリメントaして新しい値を「返す」)、a++右辺(インクリメントaして古い値の一時値を「返す」a) です。

于 2012-09-11T08:31:53.833 に答える
1

あなたが言うように、あまり意味のあるコードではありませんが、++aa をインクリメントしてインクリメントされた変数の値をa++生成し、変数の左辺値を生成してから a をインクリメントします (代入によって上書きされます)。a の値に代入することはできません。左辺値が必要です (これは基本的に、関連するメモリが割り当てられた値です)。

于 2012-09-11T08:31:42.163 に答える