switch文

値そのもので分けるとき

前回の else if は「90以上」「80以上」のような範囲の判定に向いています。一方で、前回付けたランクごとにコメントを出し分けたいときは、範囲ではなく「A のとき」「B のとき」という値そのものの一致です。こういうときは switch 文が読みやすくなります。

switch (rank) { case 'A': printf("素晴らしい成績です\n"); break; case 'B': printf("よくできています\n"); break; default: printf("不明なランクです\n"); break; }

switch の丸かっこの値と、各 case のうしろの値を上から順に照合し、一致したところへ飛びます。どれにも一致しなければ default へ行きます。default は省略できますが、else if の最後の else と同じで、想定外の値を受け止める場所として必ず書いてください。

case に書けるのは定数だけ

switch に渡せるのは整数として扱える値です。intchar が代表です。double は使えません。また case のうしろに書けるのは、コンパイルの時点で値が決まっている定数だけで、case score: のように変数を書くことも、case > 80: のように範囲を書くこともできません。範囲で分けたいときは else if の出番です。

文字は 'A' のようにシングルクォートで囲みます。ダブルクォートの "A" は文字列で別物なので、ここでは使えません。

break を忘れると下へ落ちる

switch の最大の落とし穴がこれです。case は「そこへ飛び込む入口」でしかなく、区切りではありません。break に出会うまで、下の case のラベルを無視してそのまま実行を続けます。これをフォールスルーと呼びます。

char rank = 'B'; switch (rank) { case 'A': printf("1"); case 'B': printf("2"); case 'C': printf("3"); break; case 'D': printf("4"); }

出力は 23 です。'B' の入口から入り、break が無いのでそのまま case 'C' の中身まで実行し、そこの break でようやく抜けます。コンパイルエラーにはならないので、テストするまで気づけません。各 case の最後に break を書く、を体で覚えてください。

要件

  1. scanf の書式は " %c" にして、char 型の変数へ読み込む
  2. まず「ランクはAです」の形で表示する
  3. A は「素晴らしい成績です」、B は「よくできています」、C は「合格ラインです」、D は「もう一息です」、F は「再履修が必要です」
  4. どれにも当てはまらない文字のときは「不明なランクです」と表示する
  5. if ではなく switch と case で書き、各 case に break を付ける

入出力例

main("A") → "ランクはAです 素晴らしい成績です" main("B") → "ランクはBです よくできています" main("D") → "ランクはDです もう一息です" main("F") → "ランクはFです 再履修が必要です" main("X") → "ランクはXです 不明なランクです"

ヒント

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

メモ

switch文

⌘S で保存