switch式(アロー / yield / fall-through無し)難易度 標準無料
次のコード(Java 17)の出力として正しいものを選べ。
1 public class Q1 {
2 static int f(int n) {
3 return switch (n) {
4 case 1, 2 -> 10;
5 case 3 -> { yield 30; }
6 default -> 0;
7 };
8 }
9 public static void main(String[] a) {
10 System.out.println(f(2) + f(3) + f(9));
11 }
12 }
- A
40 - B
30 - Cコンパイルエラー(
case 3のブロックにyieldが必要) - D
0
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済
解説
switch式(アロー構文)は従来の
各誤答が違う理由case:(コロン)と違い、fall-through(次のcaseへの流れ込み)が起きない。
各ラベルに対応するのは右辺の式1つ、または { ... yield 値; } のブロックだけで、break も不要。
f(2):case 1, 2(複数ラベルは1つに束ねられる)にマッチ → 10。fall-throughしないので他caseは走らない。f(3):case 3はブロック本体なので値の返却にyieldが必須 → 30。f(9):どのcaseにも該当せずdefault→ 0。
合計は 10 + 30 + 0 = 40。switch式は値を返すので return switch(...) {...}; と書ける。
- B
yieldを使うcase 3だけが値を返す、と誤解した答え。f(2)=10・f(9)=0も加算されるので合計40。 - Cブロック本体には確かに
yieldが必要だが、コードにはyield 30;が有り正しく書かれている。よってコンパイルは通る。 - D
defaultだけが評価されるとした誤り。f(2)・f(3)はそれぞれ該当caseにマッチする。
ひっかけ: アロー構文の switch は fall-through しない(コロン構文の癖で「複数caseが流れ込んで加算」と誤読しやすい)。ブロック本体(
{ })で値を返すには yield が必須で、これは正しく書かれているためコンパイルは通る。実機確認の答え合わせ
出力: 40
公式ドキュメント・関連JLS SE17 §15.28 switch Expressions↗
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)