Java | 短絡評価 vs 非短絡評価の違い

Java Java
スポンサーリンク

このテーマ(短絡評価 vs 非短絡評価の違い)は、
Java を本格的に書くようになるとバグを防ぐための重要ポイントになります。

では、実際の挙動を「見て理解できる」ように、副作用(インクリメント)を含んだ実験コードを用意します。
一緒に解説も付けています。


実験テーマ

  • &&& の違い
  • ||| の違い
  • 副作用(++ の影響)が起こるかどうかを観察

実験コード(コピーしてそのまま動かせます)

public class ShortCircuitTest {
    public static void main(String[] args) {
        int a = 0;
        int b = 0;

        System.out.println("=== &&(短絡評価) のテスト ===");
        if (a > 0 && ++b > 0) {
            System.out.println("条件成立");
        }
        System.out.println("a = " + a + ", b = " + b);
        // b はどうなる?

        System.out.println("\n=== &(非短絡評価) のテスト ===");
        a = 0;
        b = 0;
        if (a > 0 & ++b > 0) {
            System.out.println("条件成立");
        }
        System.out.println("a = " + a + ", b = " + b);

        System.out.println("\n=== ||(短絡評価) のテスト ===");
        a = 1;
        b = 0;
        if (a > 0 || ++b > 0) {
            System.out.println("条件成立");
        }
        System.out.println("a = " + a + ", b = " + b);

        System.out.println("\n=== |(非短絡評価) のテスト ===");
        a = 1;
        b = 0;
        if (a > 0 | ++b > 0) {
            System.out.println("条件成立");
        }
        System.out.println("a = " + a + ", b = " + b);
    }
}
Java

🔎 実行結果(出力例)

=== &&(短絡評価) のテスト ===
a = 0, b = 0

=== &(非短絡評価) のテスト ===
a = 0, b = 1

=== ||(短絡評価) のテスト ===
条件成立
a = 1, b = 0

=== |(非短絡評価) のテスト ===
条件成立
a = 1, b = 1

💬 解説(じっくり理解)

✅ 1. &&(論理積:短絡評価あり)

if (a > 0 && ++b > 0)
Java
  • 左の条件 a > 0false
  • && の性質上「両方 true でないと true にならない」ため、
    右側は見なくても結果は false
  • よって ++b実行されず、副作用が起きない
  • ⇒ b は 0 のまま。

✅ 2. &(論理積:短絡評価なし)

if (a > 0 & ++b > 0)
Java
  • & は左が false でも 右を必ず評価する
  • ++b が実行されるので b = 1。
  • 両方を必ず評価する点が && との違い。

✅ 3. ||(論理和:短絡評価あり)

if (a > 0 || ++b > 0)
Java
  • 左の a > 0 が true。
  • || は「どちらかが true なら true」なので、
    右側を見なくても結果は true
  • ++b は実行されず、副作用なし。

✅ 4. |(論理和:短絡評価なし)

if (a > 0 | ++b > 0)
Java
  • 左が true でも右を必ず評価する。
  • ++b 実行、b = 1。
  • 結果は true(どちらかが true)+副作用あり。

⚠️ 実務での注意

短絡評価(&&, ||)は安全のためによく使われます

たとえば:

if (obj != null && obj.value == 10) { ... }
Java

このとき obj が null でも、obj.value は評価されません。
だから NullPointerException を防げます。

もし & にしていたら右側も実行されるので、obj が null のときクラッシュ(例外)します。


まとめ表

演算子意味短絡評価右側が評価される?よく使う?
&&AND(かつ)あり左が false のとき ×✅ よく使う
&AND(かつ)なし常に ○⚠️ 注意して使う
``OR(または)あり
``OR(または)なし常に ○

学習ステップ提案

  1. 上記コードを少しずつ書き換えて挙動を確かめてみる。
  2. ++b の代わりに System.out.println("右を評価") と書いても効果が見える。
  3. obj != null && obj.method() のような実用パターンを試して、短絡評価のありがたみを体感する。

See the Pen Short-Circuit Evaluation vs. Non-Short-Circuit Evaluation Experiment by MONO365 -Color your days- (@monoqlo365) on CodePen.

概要

  • 4つのテストボタン(&&, &, ||, |
  • クリックすると、各評価の流れをコンソールと画面上に出力
  • 「右側を評価したか?」を色でわかりやすく表示
  • JavaScript版(ブラウザで即動作・Javaの理解にも対応)

使い方

  1. 「Run」または「再生」ボタンを押すと、4つのボタンが表示されます。
  2. 各ボタンを押すと結果がリアルタイムに出力されます。
    • 緑色 → 評価された(副作用あり)
    • グレー → スキップされた(短絡評価で無視された)

学習のポイント

  • 「短絡評価」では右側を無駄に評価しないため、安全で効率的。
  • 「非短絡評価」では右側も実行されるため、副作用に注意。
  • JavaScript と Java は評価ルールが同じなので、この挙動はそのまま Java に当てはまります。
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました