
🟢 はじめに
Javaの学習をしていると、必ずと言っていいほど出会うのが
だと思います。
単独で使う分には簡単なのですが、これが switch 文と組み合わさると、途端にひっかけ問題に変わります。
今回は、初心者が引っかかりやすい
の動きを解説してみたいと思います。
🚪 魔法のダンジョンでの選択
まずは、以下のJavaコードを見てください。
勇者が「MP(マジックポイント)」を使って、魔法のダンジョンの扉を開けるシーンです。
public class MagicDungeon { public static void main(String[] args) { int mp = 5; // 勇者の初期MPは「5」 // 扉の番人にMPを見せて、進む部屋を決める switch (mp--) { case 4 -> { System.out.println("【MP4の部屋】へ入りました"); mp += 2; // 宝箱でMP回復 } case 3 -> { System.out.println("【MP3の部屋】へ入りました"); mp *= 2; // MPが2倍に } default -> { System.out.println("【秘密の部屋】へ案内された…"); --mp; // 部屋の入場料としてMPを先払い } } System.out.println("最終的な勇者のMP: " + mp); } }
パッと見たとき、
と思いませんでしたか?
実は、このプログラムを実行すると 【秘密の部屋】 に案内され、最終的なMPは 3 になります。
一体、裏で何が起きているのでしょうか?
📉 ステップ解説:番人とのやり取りの裏側
このコードの最大のポイントは、switch (mp--) の部分です。
mp-- は「後置(こうち)デクリメント」と呼ばれ、「今の数字を先に使ってから、後で1減らす」 というルールです。
ストーリーに沿って、1歩ずつ動きを見ていきましょう。
① 扉の番人へのアピール(判定)
勇者は扉の番人に対して、現在のMPである 5 を提示します。
② 後置デクリメントの発動(変化)
番人が
と振り返ったその瞬間、後置デクリメントが発動し、勇者のMPはこっそり 4 に減らされてしまいます。
③ 部屋探し(分岐)
番人は、勇者から最初に聞いた 5 という数字をもとに部屋を探します。
しかし、用意されているのは case 4 と case 3 だけ。
5 の部屋はありません。
④ 秘密の部屋へ(default)
該当する部屋がなかったため、番人は勇者を default(その他の人専用)である【秘密の部屋】へ案内します。
⑤ 部屋の中での出来事
秘密の部屋に入った時点での勇者のMPは、②ですでに減らされているため 4 です。
部屋の中では --mp(前置デクリメント:先に1減らす)が待ち受けており、入場料として真っ先にMPが1引かれます。
その結果、
のです。
📝 まとめ:前払いか、後払いか
引っかけ問題を解くときのコツは、この2つの違いを意識すると解きやすくなると思います。
🔹--mp(前置デクリメント): 真っ先に数字が減ってから、その数字を見せる(前払い)
Java学習中の方の参考になれば幸いです🙌