System.out.println("Java学習中");

【Java / Spring Boot】UI/UXの視点を活かしたバックエンド開発の学習ポートフォリオ

【Java Silver対策】「||(2本線)」と「|(1本線)」の違い🤔思わぬバグを防ぐポイントを解説☕️

🟢 はじめに

Javaの学習をしていると、条件式で「またはOR)」を表すときに || をよく使うと思いますが、 | のように1本線で書くこともできます。

実はこの2つ、プログラムの動き方が全く違うため、思わぬバグの原因になることがあります。

今回は、この2つの違いを「カフェのスタンプカード」に例えて、初心者向けに分かりやすく解説したいと思います。


☕️ 以下のコード、出力はどうなるか?

カフェで「スタンプが5個貯まる」か「ボーナス条件を満たす」と、ドリンクが無料になるシステムがあるとします。

public class Main {
    public static void main(String[] args) {
        int stamp = 4;      // 現在のスタンプ数
        int bonusPoint = 0; // おまけのボーナスポイント

        // 注目!ここは「|(1本線)」を使っています
        if ((++stamp == 5) | ((bonusPoint += 10) == 10)) {
            System.out.println("ドリンク1杯無料です!☕️");
        }

        // 最後にボーナスポイントを確認
        System.out.println("もらったボーナスポイント: " + bonusPoint);
    }
}

このプログラムを実行したとき、最後の bonusPoint はいくつになるでしょうか?

0のまま」でしょうか? それとも「10に増えている」でしょうか?🤔


🟨 ||(2本線)は「ファストパス(近道)」

私たちが普段よく使う ||2本線)は、専門用語で「ショートサーキット短絡評価)」と呼ばれる動きをします。

左側の条件が「True正解)」だと分かった瞬間、「あ、もう片方の条件も見なくても、全体の条件クリアだね!」と判断して、右側の処理をスキップします。

もし先ほどのコードが ||2本線)だった場合……

  1. 左側の ++stamp == 5 をチェック(スタンプが4から5になり、5==5True

  2. 左がTrueなので、右側の bonusPoint += 10完全スルーされます。

  3. 結果、bonusPoint0 のままになります。


👮‍♂️ |(1本線)は「超・真面目な検査官」

今回のコードは |1本線)です。

1本線の | は、どんなに左側がTrueであっても近道を許さない「真面目な検査官」です。

左側で条件はクリアしていますが、ルールなので右側もキッチリ実行してチェックします!」と、必ず右側のプログラムも動かしてしまいます。

そのため、今回のコードの動きはこうなります。

  1. 左側の ++stamp == 5 をチェック(True

  2. 検査官が右側もチェックしに行くため、bonusPoint += 10 が実行される。

  3. 結果、bonusPoint10が足されて、中身が 10 に書き換わってしまう。


🎉 正解

というわけで、先ほどのコードの実行結果はこちらです。

ドリンク1杯無料です!☕️
もらったボーナスポイント: 10

変数の値がいつの間にか変わってしまっています。


✍️ まとめ

||2本線):左がTrueなら、右はスルー(基本はこちらを使えばOK)

|1本線):左がTrueでも、右を必ず実行(値が書き換わることに注意)

実務のWebアプリケーション開発などでは、無駄な処理を省いて動作を軽くするため、基本的にショートサーキットである ||2本線)や &&ANDの2本線)を使うことが多いと聞きます。

しかし、Java Silverなどの資格試験では、プログラマがこの仕様をちゃんと理解しているかを試すために、あえて | が出題されることがよくあると言われています。

Java学習中の方の参考になれば幸いです。


【プロフィール・作品置き場】

kenichikamoi.com


🎵 Youtube(楽曲一覧)はこちら

www.youtube.com