Java 演算子(Operator)
演算子(Operator)は、与えられた変数やリテラルに対して演算を行うためのものである。演算子によって処理される対象を被演算子(Operand)という。
演算子は代入演算子、算術演算子、ビット演算子、比較(関係)演算子、論理演算子などに分類できる。
代入演算子
代入演算子は、プログラミングを初めて行う人には少し混乱しやすい。一般数学での単一の等号記号 = は等しいという表現にだけ使われるが、プログラミングでは変数への割り当て、つまり代入を意味する。
次の例では、値や式を変数に代入する。
- 変数 = 値
int a = 1; // 変数 a に 1 が代入される。
- 変数 = 式
int a = 1 + 2; // 変数 a に 1+2 をして 3 が代入される。
- 変数 = 変数 = 変数… = 値(または式)
int a, b, c;
a = b = c = 100 // a、b、c 変数に同じく 100 が代入される。
変数の式のデータ型と同じ、または互換性がなければならない。
int a = 1;
boolean b = true;
int c = a + b; // コンパイル error
算術演算子
算術演算子(arithmetic operators)は、一般数学で使われるものと同じ方式で算術式に使用する。
基本的な算術演算子
足し算、引き算、掛け算、割り算のように、すべての数値型に対する算術演算ができる。
| 演算子 | 機能 | 使用法 | 使用説明 |
|---|---|---|---|
| + | 加算 | op1 + op2 | op1 と op2 を加える。 |
| - | 減算(または単項マイナス) | op1 - op2 | op1 から op2 を引く。 |
| * | 乗算 | op1 * op2 | op1 と op2 を掛ける。 |
| / | 除算 | op1 / op2 | op1 を op2 で割る。 |
| % | 剰余 | op1 % op2 | op1 を op2 で割った余りを求める。 |
例 1)
package com.devkuma.tutorial.operators;
public class Arithmetic {
public static void main(String[] args) {
int a = 1 + 3;
int b = a - 2;
int c = b * 5;
int d = c / 2;
int e = d % 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=4
b=2
c=10
d=5
e=2
インクリメント演算子とデクリメント演算子
インクリメント演算子は 1 増加させ、デクリメント演算子は 1 減少させる。
演算子がどこに位置するかによって異なる結果になる。たとえば op の初期値が 2 だと仮定すると、++op のように演算子が前に来る場合は増加後の値 3 を返し、op++ のように演算子が後ろに来る場合は増加前の値 2 を返し、op の値は 3 になる。
| 演算子 | 機能 | 使用法 | 使用説明 |
|---|---|---|---|
| ++ | 前置(prefix)増加 | ++op | op の値を 1 増加させ、増加後の値を返す。 |
| 後置(postfix)増加 | op++ | op の値を 1 増加させ、増加前の値を返す。 | |
| – | 前置(prefix)減少 | –op | op の値を 1 減少させ、減少後の値を返す。 |
| 後置(postfix)減少 | op– | op の値を 1 減少させ、減少前の値を返す。 |
例 2)
package com.devkuma.tutorial.operators;
public class Increase {
public static void main(String[] args) {
int a = 10;
System.out.println(a++);
System.out.println(++a);
System.out.println(a--);
System.out.println(--a);
}
}
実行結果:
10
12
12
10
算術的な代入演算子
代入演算子と他の算術演算子を組み合わせて使う形の演算子である。
たとえば a += 2 とすると、a に 2 を加え、その値を a に代入する。
| 演算子 | 機能 | 使用法 | 意味 |
|---|---|---|---|
| += | 加算代入 | op1 += op2 | op1 = op1 + op2 |
| -= | 減算代入 | op1 -= op2 | op1 = op1 - op2 |
| *= | 乗算代入 | op1 *= op2 | op1 = op1 * op2 |
| /= | 除算代入 | op1 /= op2 | op1 = op1 / op2 |
| %= | 剰余代入 | op1 %= op2 | op1 = op1 % op2 |
例 3)
package com.devkuma.tutorial.operators;
public class AssignmentOperator {
public static void main(String[] args) {
int a = 4;
int b = 5;
int c = 6;
a += 4;
b -= 2;
c += a * b;
c %= 7;
System.out.println("a=" + a);
System.out.println("b=" + b);
System.out.println("c=" + c);
}
}
実行結果は次のとおりである。
a=8
b=3
c=2
ビット演算子
基本的なビット演算子
ビット演算子は二進ビット演算を行う。
3 と 6 を &(AND) 演算すると、0011(3) と 0110(6) の各ビットに AND を適用し、0010 という結果値 2 になる。
- 0011(3) & 0110(6) = 0010(2)
| 演算子 | 機能 | 使用法 | 使用説明 |
|---|---|---|---|
& |
AND | op1 & op2 | ビット単位の論理積 |
| ` | ` | OR | op1 | op2 |
^ |
XOR | op1 ^ op2 | ビット単位の排他的論理和 |
~ |
NOT | ~op1 | ビット単位の否定 |
例 4)
package com.devkuma.tutorial.operators;
public class Bit {
public static void main(String[] args) {
int a = 3;
int b = 6;
int c = a & b;
int d = a | b;
int e = a ^ b;
int f = (~a & b) | (a & ~b);
System.out.println("c=" + c);
System.out.println("d=" + d);
System.out.println("e=" + e);
System.out.println("f=" + f);
}
}
実行結果:
c=2
d=7
e=5
f=5
シフト演算子
- シフト演算子(shift operators)には、左シフト(left shift)、右シフト(right shift)、符号なし右シフト(Unsigned Right Shift)がある。
- 符号なし右シフト(Unsigned Right Shift)演算子は 32bit と 64bit の値でのみ使用される。
| 演算子 | 機能 | 使用法 | 使用説明 |
|---|---|---|---|
| » | 右シフト | op1 » op2 | op1 を op2 だけ右へシフト |
| « | 左シフト | op1 « op2 | op1 を op2 だけ左へシフト |
| »> | 符号なし右シフト | op1 »> op2 | op1 を op2 だけ右へシフトし、左側には常に符号に関係なく 0 が埋められる |
例 5)
package com.devkuma.tutorial.operators;
public class Shift {
public static void main(String[] args) {
// 1000(8)를 2만큼 오른쪽으로 비트를 옮기면 100000(32)가 된다.
byte a = 8 << 2;
// 1000(8)를 2만큼 왼쪽으로 비트를 옮기면 10(2)가 된다.
byte b = 8 >> 2;
// -1를 32bit로 표현하면 11111111111111111111111111111111이 되고,
// 이를 2만큼 오른쪽으로 쉬프트하면서 왼쪽에는 항상 부호에 무관하게 0이 채워짐
// 그래서 값은 01111111111111111111111111111111(2147483647)이 된다.
int c = -1 >>> 1;
System.out.println("a=" + a);
System.out.println("b=" + b);
System.out.println("c=" + c);
}
}
実行結果:
a=32
b=2
c=2147483647
ビット代入演算子
代入演算子と他のビット演算子を組み合わせて使う形の演算子である。
| 演算子 | 機能 | 使用法 | 意味 |
|---|---|---|---|
&= |
AND 代入 | op1 &= op2 | op1 = op1 & op2 |
| ` | =` | OR 代入 | op1 |= op2 |
^= |
XOR 代入 | op1 ^= op2 | op1 = op1 ^ op2 |
>>= |
» 代入 | op1 »= op2 | op1 = op1 « op2 |
<<= |
« 代入 | op1 «= op2 | op1 = op1 « op2 |
>>>= |
»> 代入 | op1 »>= op2 | op1 = op1 »> op2 |
ビット演算子の論理結果表
| A | B | A&B | A|B | A^B | ~A |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 1 |
| 1 | 0 | 0 | 1 | 1 | 0 |
| 0 | 1 | 0 | 1 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 | 0 |
比較(関係)演算子
比較(関係)演算子は二項演算子として、一方の演算項がもう一方の演算項に対して持つ関係を決定する。
これらの演算の結果値は常にブール型(true または false)であるため、if 文のような制御文や for 文のような繰り返し文でよく使用される。
| 演算子 | 機能 | 使用法 | 使用説明 |
|---|---|---|---|
> |
より大きい | op1 > op2 |
op1 が op2 より大きい場合 true、そうでなければ false |
>= |
より大きいか等しい | op1 >= op2 |
op1 が op2 以上の場合 true、そうでなければ false |
< |
より小さい | op1 < op2 |
op1 が op2 より小さい場合 true、そうでなければ false |
<= |
より小さいか等しい | op1 <= op2 |
op1 が op2 以下の場合 true、そうでなければ false |
== |
等しい | op1 == op2 |
op1 と op2 が等しい場合 true、そうでなければ false |
!= |
等しくない | op1 != op2 |
op1 と op2 が等しくない場合 true、そうでなければ false |
instanceof |
インスタンスが同じ | op1 instanceof op2 |
op1 が op2 のインスタンス(オブジェクト)である場合 true、そうでなければ false |
例 6)
package com.devkuma.tutorial.operators;
public class Relation {
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = 10;
boolean d = a > b;
boolean e = a >= b;
boolean f = a < b;
boolean g = a <= c;
boolean h = a == c;
boolean i = a != b;
System.out.println("d=" + d);
System.out.println("e=" + e);
System.out.println("f=" + f);
System.out.println("g=" + g);
System.out.println("h=" + h);
System.out.println("i=" + i);
}
}
実行結果
d=false
e=false
f=true
g=true
h=true
i=true
論理演算子
論理演算子は被演算子(operand)の値を評価し、結果として true または false 値を返す。
特記事項として &&(論理積)と ||(論理和)の短絡論理演算子(Short-circuit logical operator)がある。負荷が 1 個の & と | とは異なり、最初の被演算子を評価した結果、2 番目の被演算子を評価する必要がない場合、すぐに結果を返す演算子である。そのため、2 番目の被演算子に何らかの処理があるロジックで評価されなければ、その処理は実行されない。
たとえば、次のような式で flag が true の場合、count > index++ の式は処理されないため index は増加しない。逆に flag が false の場合、index が 1 増加する。
(flag == true) || (count > index++)
| 演算子 | 機能 | 使用法 | 使用説明 |
|---|---|---|---|
& |
論理的 AND | op1 & op2 |
op1 と op2 がどちらも true の場合 true、op1 と op2 を両方評価する。 |
| ` | ` | 論理的 OR | op1 | op2 |
^ |
論理的 XOR(排他的 OR) | op1 ^ op2 |
op1 と op2 のどちらか一方以上が true の場合 false、op1 と op2 を両方評価する。 |
&& |
短絡 AND | op1 && op2 |
op1 と op2 がどちらも true の場合 true、op1 が false なら op2 を評価しない。 |
| ` | ` | 短絡 OR | |
! |
論理的単項 NOT | !op |
op が true なら false、false なら true |
例 7)
package com.devkuma.tutorial.operators;
public class Logic {
public static void main(String[] args) {
boolean a = true;
boolean b = false;
boolean c = true;
boolean d = a & b;
boolean e = a | b;
boolean f = a ^ b;
boolean g = a && b;
boolean h = a && c;
boolean i = a || b;
boolean j = a || c;
boolean k = !a;
System.out.println("d=" + d);
System.out.println("e=" + e);
System.out.println("f=" + f);
System.out.println("g=" + g);
System.out.println("h=" + h);
System.out.println("i=" + i);
System.out.println("j=" + j);
System.out.println("k=" + k);
}
}
実行結果:
d=false
e=true
f=true
g=false
h=true
i=true
j=true
k=false
論理演算子の論理結果表
A |
B |
A&B |
A|B |
A^B |
~A |
|---|---|---|---|---|---|
| false | false | false | false | false | true |
| true | false | false | true | true | false |
| false | true | false | true | true | true |
| true | true | true | true | false | false |
論理代入演算子
代入演算子と他の論理演算子を組み合わせて使う形の演算子である。
| 演算子 | 機能 | 使用法 | 意味 |
|---|---|---|---|
&= |
論理的 AND 代入 | op1 &= op2 |
op1 = op1 & op2 |
| ` | =` | 論理的 OR 代入 | op1 |= op2 |
^= |
論理的 XOR 代入 | op1 ^= op2 |
op1 = op1 ^ op2 |
三項演算子
3 つの被演算子(operand)を持つ三項演算子 ?: は、選択文の if-then-else 文を短縮して使用できる。
- 条件 ? 式1(条件が true の場合) : 式2(条件が false の場合)
条件を評価して true か false かを判別し、true なら式1を、false なら式2を実行して結果が返される。条件文(if)の代わりに代入演算子と一緒に便利に使用される。
例 3)
public class Three {
public static void main(String[] args) {
int a = 2;
int b = 3;
int max = (a > b) ? a : b;
System.out.println("max=" + max);
}
}
実行結果:
max=3
演算子の優先順位
優先順位に関係なく、式の一部を括弧 () で囲んで優先順位を指定できる。
| 優先順位 | 演算子 |
|---|---|
| 1 | (), [], . |
| 2 | ++, --, ~, ! |
| 3 | *, /, % |
| 4 | +, - |
| 5 | >>, >>>, << |
| 6 | >, >= , <, <= |
| 7 | ==, != |
| 8 | & |
| 9 | ^ |
| 10 | ` |
| 11 | && |
| 12 | ` |
| 13 | ?: |
| 14 | =, op= |