
🟢 はじめに
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本線)だった場合……
左側の
++stamp == 5をチェック(スタンプが4から5になり、5==5でTrue)左が
Trueなので、右側のbonusPoint += 10は完全スルーされます。結果、
bonusPointは0のままになります。
👮♂️ |(1本線)は「超・真面目な検査官」
今回のコードは |(1本線)です。
1本線の | は、どんなに左側がTrueであっても近道を許さない「超・真面目な検査官」です。
「左側で条件はクリアしていますが、ルールなので右側もキッチリ実行してチェックします!」と、必ず右側のプログラムも動かしてしまいます。
そのため、今回のコードの動きはこうなります。
左側の
++stamp == 5をチェック(True)検査官が右側もチェックしに行くため、
bonusPoint += 10が実行される。結果、
bonusPointに10が足されて、中身が10に書き換わってしまう。
🎉 正解
というわけで、先ほどのコードの実行結果はこちらです。
もらったボーナスポイント: 10
変数の値がいつの間にか変わってしまっています。
✍️ まとめ
|| (2本線):左がTrueなら、右はスルー(基本はこちらを使えばOK)
| (1本線):左がTrueでも、右を必ず実行(値が書き換わることに注意)
実務のWebアプリケーション開発などでは、無駄な処理を省いて動作を軽くするため、基本的にショートサーキットである ||(2本線)や &&(ANDの2本線)を使うことが多いと聞きます。
しかし、Java Silverなどの資格試験では、プログラマがこの仕様をちゃんと理解しているかを試すために、あえて | が出題されることがよくあると言われています。
Java学習中の方の参考になれば幸いです。