これは、CおよびC ++の左辺値と右辺値に関係します。
Cプログラミング言語では、前置増分演算子と後置増分演算子の両方が左辺値ではなく右辺値を返します。つまり、=
代入演算子の左側に置くことはできません。これらのステートメントは両方とも、Cでコンパイラエラーを発生させます。
int a = 5;
a++ = 2; /* error: lvalue required as left operand of assignment */
++a = 2; /* error: lvalue required as left operand of assignment */
ただし、C ++では、前置インクリメント演算子は左辺値を返し、後置インクリメント演算子は右辺値を返します。つまり、プリインクリメント演算子を含む式は、=
代入演算子の左側に配置できます。
int a = 5;
a++ = 2; // error: lvalue required as left operand of assignment
++a = 2; // No error: a gets assigned to 2!
これはなぜですか?ポストインクリメントは変数をインクリメントし、以前と同じように変数を返します、インクリメントが発生する。これは実際には単なる右辺値です。変数aの以前の値は一時的にレジスタにコピーされ、次にaがインクリメントされます。しかし、aの以前の値は式によって返され、それは右辺値です。変数の現在の内容を表しなくなりました。
前置インクリメントは、最初に変数をインクリメントし、その後、インクリメントが発生した後の変数を返します。この場合、変数の古い値を一時レジスタに格納する必要はありません。インクリメントされた後の変数の新しい値を取得するだけです。したがって、前置インクリメントは左辺値を返し、変数a自体を返します。この左辺値を別のものに割り当てることができます。これは次のステートメントのようです。これは、lvalueからrvalueへの暗黙の変換です。
int x = a;
int x = ++a;
前置インクリメントは左辺値を返すので、それに何かを割り当てることもできます。次の2つのステートメントは同じです。2番目の割り当てでは、最初にaが増分され、次にその新しい値が2で上書きされます。
int a;
a = 2;
++a = 2; // Valid in C++.