複合代入演算子は 、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 回しか評価しません。
オペランド型のテーブルに加え、式は、暗黙的に左方オペランドの cv 非修飾型に変換されます
(クラス型でない場合)。
ただし、左方オペランドがクラス型の場合、そのクラスは完成し、クラスのオブジェクトへの割り当ては、コピー代入演算と同様に行われます。C++ では、複合式および条件式は左辺値であり、複合代入式の左方オペランドとすることができます。
GNU C C 言語フィーチャーが使用可能である場合、複合式および条件式は、そのオペランドが左辺値であれば、左辺値とすることができます。
次の複合式
(a, b) の複合代入は、GNU C では有効となります (式 b、またはより一般的にシーケンスの最後の式が左辺値である場合)。
(a,b) += 5 /* Under GNU C, this is equivalent to a, (b += 5) */