三項演算子とswitch

このレッスンでできるようになることは、switch のフォールスルーを追えるようになり、switch に使える型と使えない型を答えられるようになることです。

まず予測してみます

次のコードは何を出力するでしょうか。

int n = 2; switch (n) { case 1: System.out.println("one"); case 2: System.out.println("two"); case 3: System.out.println("three"); default: System.out.println("other"); }

two だけではありません。twothreeother の 3 行が出ます。

フォールスルー

従来の switch 文は、一致した case へ飛び込んだあと、break に出会うまで下の case をラベルごと素通りして実行し続けます。これをフォールスルーと呼びます。case ラベルは「ここから始める」という目印であって、「ここだけ実行する」という囲いではありません。

break を 1 つ抜くだけで答えが変わるので、抜けている箇所を探す形の出題が定番です。default は最後に書く決まりが無く、途中に置いてもかまいません。その場合も一致する case が無ければ default から始まり、そこから下へ流れます。

switch に使える型

使えるのは次のとおりです。

  • byte short char int と、その ラッパークラス
  • String
  • 列挙型

longfloatdoubleboolean は使えません。int は使えるのに long は使えない、という非対称がそのまま設問になります。case ラベルには定数しか書けず、変数は書けません。

switch 式

アローを使った書き方では、フォールスルーが起きません。

String label = switch (n) { case 1 -> "one"; case 2, 3 -> "few"; default -> "many"; };

値を返す switch 式では、すべての場合を尽くす必要があるため、列挙型で全要素を書かないかぎり default が要ります。複数行の処理を書きたいときはブロックにして yield で値を返します。return ではない点に注意してください。

三項演算子

条件 ? 真の値 : 偽の値 は右結合なので、a ? x : b ? y : za ? x : (b ? y : z) と読まれます。上から順に条件を試す形になります。真の値と偽の値の型がそろっていないと、数値の昇格が起きて意外な型になる点も覚えておいてください。

演習

成績を判定する switch から break が抜けています。直したうえで、三項演算子で記号を決めてください。

要件

  1. 95 のとき A とプラス記号を連結した文字列を返すこと
  2. 85 のとき B だけを返すこと
  3. 72 のとき C とマイナス記号を連結した文字列を返すこと
  4. bonus は三項演算子で決めること

入出力例

grade(95)"A+" grade(85)"B" grade(72)"C-" grade(100)"A+"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.java
学習モード

メモ

三項演算子とswitch

⌘S で保存