三項演算子と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 だけではありません。two、three、other の 3 行が出ます。
フォールスルー
従来の switch 文は、一致した case へ飛び込んだあと、break に出会うまで下の case をラベルごと素通りして実行し続けます。これをフォールスルーと呼びます。case ラベルは「ここから始める」という目印であって、「ここだけ実行する」という囲いではありません。
break を 1 つ抜くだけで答えが変わるので、抜けている箇所を探す形の出題が定番です。default は最後に書く決まりが無く、途中に置いてもかまいません。その場合も一致する case が無ければ default から始まり、そこから下へ流れます。
switch に使える型
使えるのは次のとおりです。
byteshortcharintと、その ラッパークラスString- 列挙型
long、float、double、boolean は使えません。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 : z は a ? x : (b ? y : z) と読まれます。上から順に条件を試す形になります。真の値と偽の値の型がそろっていないと、数値の昇格が起きて意外な型になる点も覚えておいてください。
演習
成績を判定する switch から break が抜けています。直したうえで、三項演算子で記号を決めてください。
要件
- 95 のとき A とプラス記号を連結した文字列を返すこと
- 85 のとき B だけを返すこと
- 72 のとき C とマイナス記号を連結した文字列を返すこと
- bonus は三項演算子で決めること
入出力例
grade(95) → "A+"
grade(85) → "B"
grade(72) → "C-"
grade(100) → "A+"