この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:7
ページ更新者:guest
更新日時:2026-06-11 07:29:05

タイトル: 論理演算子
SEOタイトル: Java 論理演算子 完全ガイド(&& と & / || と | / ! / 短絡評価 / ビット演算との違い)

この記事の要点
  • 論理演算子boolean 値同士を組み合わせて真偽を判定する演算子
  • Java の論理演算子: && (AND) / || (OR) / ! (NOT) / ^ (XOR)
  • 短絡評価あり: && || — 左辺で結果が確定すれば右辺を評価しない
  • 短絡評価なし: & | — 必ず両辺を評価する。副作用ありの式で挙動が変わる
  • 優先順位: ! > && > || — 複雑な式は明示的に括弧で囲むのが鉄則

Java の論理演算子とは

論理演算子 (logical operator) は boolean 型の値を組み合わせて、AND / OR / NOT の真偽判定を行うための演算子です。ifwhile の条件式で日常的に使います。

論理演算子 一覧

演算子意味短絡評価
&&論理積 (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) {
    // ...
}

真理値表

ABA && BA || BA ^ B!A
truetruetruetruefalsefalse
truefalsefalsetruetruefalse
falsetruefalsetruetruetrue
falsefalsefalsefalsefalsetrue

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) + ストリームも使える。

関連記事

  • 比較演算子== != < 等の比較
  • 算術演算子 / 代入演算子 / ビット演算子