タイトル: 論理演算子
SEOタイトル: Java 論理演算子 完全ガイド(&& と & / || と | / ! / 短絡評価 / ビット演算との違い)
| この記事の要点 |
|
Java の論理演算子とは
論理演算子 (logical operator) は boolean 型の値を組み合わせて、AND / OR / NOT の真偽判定を行うための演算子です。if や while の条件式で日常的に使います。
論理演算子 一覧
| 演算子 | 意味 | 例 | 短絡評価 |
|---|---|---|---|
&& | 論理積 (AND) | a && b | あり |
|| | 論理和 (OR) | a || b | あり |
! | 否定 (NOT) | !a | - |
& | 論理積 (両辺評価) | a & b | なし |
| | 論理和 (両辺評価) | a | b | なし |
^ | 排他的論理和 (XOR) | a ^ b | なし |
基本例
boolean a = true;
boolean b = false;
System.out.println(a && b); // false (AND)
System.out.println(a || b); // true (OR)
System.out.println(!a); // false (NOT)
System.out.println(a ^ b); // true (XOR、異なるとき true)
// 条件式での実用例
int score = 85;
if (score >= 80 && score < 90) {
System.out.println("B 判定");
}
String name = null;
if (name != null && name.length() > 0) {
System.out.println(name); // null チェックを先に
}
短絡評価 (Short-circuit Evaluation)
Java の && と || は短絡評価を行います。左辺だけで結果が確定する場合、右辺は評価されません。
| 演算子 | 左辺の値 | 右辺の評価 |
|---|---|---|
&& | false | 評価しない (結果は false 確定) |
&& | true | 評価する |
|| | true | 評価しない (結果は true 確定) |
|| | false | 評価する |
// 典型的な null セーフ判定
String s = null;
if (s != null && s.equals("hello")) {
// s が null だと s.equals(...) は NullPointerException
// でも && は短絡評価で右辺をスキップするので安全
}
// 右辺で副作用がある場合の注意
int x = 0;
boolean result = (true || (++x > 0));
System.out.println(x); // 0 (++x は実行されない!)
result = (true | (++x > 0));
System.out.println(x); // 1 (両辺評価される)
&& と & の違い
&& は短絡 AND、& は非短絡 AND (ビット AND としての側面もあり)。boolean 同士なら結果は同じですが、評価順が異なります。
// boolean 同士 -> 論理演算子として動作
boolean r1 = true & false; // false
boolean r2 = true | false; // true
// int 同士 -> ビット演算子として動作
int b1 = 0b1100 & 0b1010; // 0b1000 = 8
int b2 = 0b1100 | 0b1010; // 0b1110 = 14
int b3 = 0b1100 ^ 0b1010; // 0b0110 = 6
// boolean に対して && のかわりに & を使うとパフォーマンス低下や
// 想定外の副作用呼び出しが起きるため、原則 && / || を使う
! 演算子 — 否定
boolean isEmpty = list.isEmpty();
if (!isEmpty) {
// 空でないときに処理
}
// よくあるパターン
if (!str.equals("")) { ... }
// より良い書き方
if (!"".equals(str)) { ... } // str が null でも NPE にならない
優先順位と括弧
| 優先順位 | 演算子 |
|---|---|
| 高 | ! |
| ↓ | 比較演算子 (< > == など) |
| ↓ | & |
| ↓ | ^ |
| ↓ | | |
| ↓ | && |
| 低 | || |
// 優先順位による落とし穴
boolean r = a || b && c; // a || (b && c) と解釈される
// 意図が「(a || b) && c」なら明示的に括弧
boolean r2 = (a || b) && c;
// 推奨: 複雑な式は必ず括弧で意図を明示
if ((age >= 18 && age < 65) || hasLicense) {
// ...
}
真理値表
| A | B | A && B | A || B | A ^ B | !A |
|---|---|---|---|---|---|
| true | true | true | true | false | false |
| true | false | false | true | true | false |
| false | true | false | true | true | true |
| false | false | false | false | false | true |
FAQ
Q: && と & はどちらを使うべき?
A: boolean 同士なら短絡評価の && / || を使うのが定石。& | はビット演算用と考える。
Q: if (a == true) と if (a) はどっち?
A: if (a) が標準。冗長な比較は可読性を落とすので避ける。
Q: NullPointerException を避けるには?
A: if (obj != null && obj.method()) のように null チェックを左に置く。Objects.nonNull(obj) + ストリームも使える。
関連記事
- 比較演算子 —
==!=<等の比較 - 算術演算子 / 代入演算子 / ビット演算子