こんにちは、現役SEの「とも」です。
今回は代入演算子について説明します。
- 代入演算子は、左辺の変数に右辺の式の結果を代入する演算子です。
- 演算しながら代入する演算子もあります。
右辺の演算結果を左辺の変数に代入することは、これまでも例として頻繁に使ってきました。
右辺には、整数型の「リテラル」または「変数」が使用できますが、基本的に変数のデータ型は右辺と左辺で同じ必要があります。
異なるデータ型の場合、次回の記事でお伝えする「キャスト」をしてデータ型の変換をする必要があります。
【代入演算子】
演算子 | 例 | 説明 |
---|---|---|
= | A = B | Bの演算結果をAに代入する |
+= | A += B | A = A + Bと同じ |
-= | A -= B | A = A – Bと同じ |
*= | A *= B | A = A * Bと同じ |
/= | A /= B | A = A / Bと同じ |
%= | A %= B | A = A % Bと同じ |
&= | A &= B | A = A & Bと同じ |
|= | A |= B | A = A | Bと同じ |
^= | A ^= B | A = A ^ Bと同じ |
<<= | A <<= B | A = A << Bと同じ |
>>= | A >>= B | A = A >> Bと同じ |
>>>= | A >>>= B | A = A >>> Bと同じ |
各代入演算子のサンプル
【代入(=)】
=を基準に、左側を左辺、右側を右辺と言います。
=の機能は、右辺の演算結果を左辺の変数に入れることです。
注意点としては、前述したように右辺と左辺は同じデータ型とする必要があります。
int a = 1; //リテラルを代入
int b = 1 + 2; //リテラルの演算結果を代入
int c = 2 + b; //リテラルと変数の演算結果を代入
int d = b + c; //変数の演算結果を代入
boolean e = b == 3; //比較結果を代入
System.out.println("a:" + a);
System.out.println("b:" + b);
System.out.println("c:" + c);
System.out.println("d:" + d);
System.out.println("e:" + e);
【結果】
a:1
b:3
c:5
d:8
e:true
【四則演算と余りの演算「+=」「-=」「*=」「/=」「%=」】
左辺に代入する際、右辺の演算結果と左辺の変数を四則演算して左辺の変数に代入します。
算術演算子と同様に、使用できるデータ型は整数型か浮動小数点型になります。
int a = 1; //初期値を設定
int b = 2; //初期値を設定
int c = 3; //初期値を設定
int d = 4; //初期値を設定
int e = 5; //初期値を設定
a += 1; //aに右辺のリテラルを足して代入
b -= 5 + 5; //bから右辺の演算結果を引いて代入
c *= a; //cに右辺の変数を掛けて代入
d /= 2; //dを右辺のリテラルで割って代入
e %= 2; //eを右辺のリテラルを割った余りを代入
System.out.println("a:" + a);
System.out.println("b:" + b);
System.out.println("c:" + c);
System.out.println("d:" + d);
System.out.println("e:" + e);
【結果】
a:2
b:-8
c:6
d:2
e:1
【ビット演算「&=」「|=」「^=」】
左辺に代入する際、右辺の演算結果と左辺の変数をビット演算して左辺の変数に代入します。
ビット演算子と同様に、使用できるデータ型は整数型になります。
int a = 0b0101_0101_0101_0101_0101_0101_0101_0101; //初期値を設定
int b = a; //初期値を設定
int c = a; //初期値を設定
int d = 0b0000_0000_0000_0000_1111_1111_1111_1111; //初期値を設定
int e = 0b0000_0000_0000_0000_0000_0000_1111_1111; //初期値を設定
a &= d; //aに右辺の変数をAND(&)した結果を代入する
b |= d & e; //bに右辺の演算結果をOR(|)した結果を代入する
c ^= d << 4; //cに右辺の演算結果をXOR(^)した結果を代入する
System.out.println("【2進数で表示】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(a)).replace(" ", "0") + "【a &= d】の結果");
System.out.println(String.format("%32s\t", Integer.toBinaryString(b)).replace(" ", "0") + "【b |= d & e】の結果");
System.out.println(String.format("%32s\t", Integer.toBinaryString(c)).replace(" ", "0") + "【c ^= d << 4】の結果");
【結果】
【2進数で表示】
00000000000000000101010101010101 【a &= d】の結果
01010101010101010101010111111111 【b |= d & e】の結果
01010101010110101010101010100101 【c ^= d << 4】の結果
【シフト演算「<<=」「>>=」「>>>=」】
左辺に代入する際、右辺の演算結果の値だけ左辺の変数をシフト演算して左辺の変数に代入します。
シフト演算子と同様に、使用できるデータ型は整数型になります。
int a = 0b1000_0000_0000_1111_0000_0000_0000_0000; //初期値を設定
int b = a; //初期値を設定
int c = a; //初期値を設定
a <<= 4; // 4ビット左シフト
b >>= 4; // 4ビット右シフト(符号化あり)
c >>>= 4; // 4ビット右シフト(符号化なし)
System.out.println("【2進数で表示】");
System.out.println(String.format("%32s\t", Integer.toBinaryString(a)).replace(" ", "0") + "【a <<= 4】の結果");
System.out.println(String.format("%32s\t", Integer.toBinaryString(b)).replace(" ", "0") + "【b >>= 4】の結果");
System.out.println(String.format("%32s\t", Integer.toBinaryString(c)).replace(" ", "0") + "【c >>>= 4】の結果");
【結果】
【2進数で表示】
00000000111100000000000000000000 【a <<= 4】の結果
11111000000000001111000000000000 【b >>= 4】の結果
00001000000000001111000000000000 【c >>>= 4】の結果
まとめ
演算を伴う代入演算子は、うまく使うと見やすくなりますが、使い方を間違えると見にくくなります。
式の意味で使い分けると見やすくなると思います。
例)
total += a + (b + c) * d; // ○○の計算結果を合計に足す
data &= mask_base << mask_ptn1; // パターン1のマスクでデータをマスクする
以上が代入演算子でした。