複合代入

複合代入演算子は 、2 項演算子と単純代入演算子で構成されます。複合代入演算子は、両方のオペランドに 2 項演算子の演算を実行し、その演算の結果を左方オペランド (変更可能な左辺値である必要がある) に保管します。

次の表では、複合代入式のオペランドの型を示します。

演算子 左方オペランド 右方オペランド
+= または -= 算術 算術
+= または -= ポインター 整数型
*=、/=、および %= 算術 算術
<<=、>>=、&=、^=、および |= 整数型 整数型

次の式

a *= b + c

は、以下と同等です。

a = a * (b + c)

そして、次の式とは同等でない ことに注意してください。

a = a * b + c

次の表では、複合代入演算子をリストし、各演算子を使用した式を示します。

演算子 等価な式
+= index += 2 index = index + 2
-= *(pointer++) -= 1 *pointer = *(pointer++) - 1
*= bonus *= increase bonus = bonus * increase
/= time /= hours time = time / hours
%= allowance %= 1000 allowance = allowance % 1000
<<= result <<= num result = result << num
>>= form >>= 1 form = form >> 1
&= mask &= 2 mask = mask & 2
^= test ^= pre_test test = test ^ pre_test
|= flag |= ON flag = flag | ON

等価な式の列では、左方オペランド (例の列の) を 2 回示していますが、 左方オペランドを事実上 1 回しか評価しません。

C++オペランド型のテーブルに加え、式は、暗黙的に左方オペランドの cv 非修飾型に変換されます (クラス型でない場合)。

ただし、左方オペランドがクラス型の場合、そのクラスは完成し、クラスのオブジェクトへの割り当ては、コピー代入演算と同様に行われます。C++ では、複合式および条件式は左辺値であり、複合代入式の左方オペランドとすることができます。

C GNU C C 言語フィーチャーが使用可能である場合、複合式および条件式は、そのオペランドが左辺値であれば、左辺値とすることができます。 次の複合式 (a, b) の複合代入は、GNU C では有効となります (式 b、またはより一般的にシーケンスの最後の式が左辺値である場合)。

(a,b) += 5  /* Under GNU C, this is equivalent to
a, (b += 5)    */
IBM Copyright 2003