WisdomSoft - for your serial experiences.

2.11 複合代入演算

変数の現在の値に対して、指定した演算子による計算結果を代入する複合代入演算子を紹介します。複合代入演算子は A = A op B という計算を A op= B と省略して記述できます。

2.11.1 計算と代入

通常の代入演算子 = は、より具体的には単純代入演算子と表現します。実は、このほかに演算と代入を同時に行う複合代入演算子と呼ばれる演算子が存在します。複合代入演算子は、例えば次のような計算を行うときに便利です。

iValue1 = iValue1 + iValue2;

これは、iValue1 の現在の値に iValue2 を加算したい場合に使う式です。このように、現在の値から相対的に計算をしたい場合は同じ変数を複数記述することになるでしょう。複合代入演算子を使えば、これを簡単にまとめることができます。複合代入演算子は op= という形式の演算子で、op の部分には算術演算子、または論理演算子を当てはめます。

表1 複合代入演算子
演算子
+= A += B
-= A -= B
*= A *= B
/= A /= B
%= A %= B
<<= A <<= B
>>= A >>= B
>>>= A >>>= B
&= A &= B
^= A ^= B
|= A |= B

A op= B という複合代入演算は、A の型を T と仮定して A = (T)((A) op (B)) に等しいとされています。これは、まさに上記したように、代入対象の変数に対して相対的な演算を行いたい時に適しています。また、複合代入演算子は暗黙的にキャスト演算を行っていることに注目しなければなりません。これは、ナローイング変換が暗黙的に行われることを意味します。

コード1
class Test {
	public static void main(String args[]) {
		byte bValue = 2;
		bValue += 0xFF04;
		bValue += 8.0;
		bValue >>= 1;
		System.out.println(bValue);
	}
}
実行結果
>java Test
7

コード1では、まず bValue を 2 で初期化し、その後、複合代入演算子を使って整数型 0xFF04 を代入しています。単純代入演算子であれば、このリテラルは 1 バイトを超えているため安全なナローイング変換とはみなされませんが、複合代入演算子はキャスト演算を暗黙的に行うため、問題にはなりません。整数の下位1バイトのみがナローイング変換によって抽出され bValue に加算されます。

次の 8.0 という浮動小数点型を加算代入する場合も同じです。この時点で bValue の値は 14 となりますが、次に bValue を右シフトするため、最終的な値は 7 となります。