C言語 switch文の使い方【if文との使い分けの考え方教えます】

C言語
この記事は約9分で読めます。

こんにちは、ナナです。

C言語にはif文以外にも分岐の道を作り出す方法が用意されています。それがswitch文です。switch文もよく利用される分岐処理なので特徴を押さえて使いこなしましょう。

if文や分岐処理の基礎に付いて学びたい方は次の記事を参照してください。

本記事では次の疑問点を解消する内容となっています。

本記事で学習できること
  • switch文を使った分岐処理とは?
  • switch文で使うbreak命令の使い方と注意点とは?
  • 3項演算子を使った分岐処理とは?
  • if文とswitch文の使い分けとは?

では、switch文を使った分岐処理の基礎を学んでいきましょう。

スポンサー

switch文を使ってプログラムの分岐を複数作ってみよう

if文の他にも分岐させる方法があるって風の噂で聞きました。
その技を使いこなしたいんです。師匠、新しい技を伝授してください!

ナナ
ナナ

ふむふむ、新しい分岐ね。if文以外の分岐っていうとswitch文だね。
if文とはまた違った分岐の書き方だから覚えておくといいね。

C言語にはswitch文というもう一つの分岐処理が存在します。

if文ほどではないですが、switch文もよく見かける構文のため使い方を覚えておきましょう。

switch文の書き方と使い方

switch文の書き方は次のものになります。if文と書き方がかなり違うのがわかりますね。

書き方

 switch (変数名)
 {
 case 数値1:
   変数の値は数値1の時に行う処理;
   break;
 case 数値2:
    変数の値は数値2の時に行う処理;
   break;
 default:
   変数の値はどれでもない時に行う処理;
   break;
 }

if文と異なり条件式を書くのではなく、ある変数の値で処理を分岐させるのがswitch文の特徴です。

変数と数値の一致判定しかできないため、if文の限定版の分岐処理とも言えます。

変数の値がcase文で指定した数値のどれにも該当しない場合は、default文の処理が実施されます。default文の記述は省略することもできますが、省略しない方が一般的です。

break文の意味と使い方

case文とdefault文にはbreak文を付けるのが基本です。

break文を実行するとそこでswitch文の処理を終了し、{}の外側まで処理が移動します。break文を付け忘れてしまうと、次のcase文が実行されてしまうため注意が必要です。

break文の処理イメージ
ナナ
ナナ

break文は慣れてないと忘れてしまいがちだから気を付けてください。私の場合は処理内容を書く前に、必要なcase文やbreak文を先に書いちゃいます。

このようなテクニックはマネするとよいですよ。

switch文を使ったプログラム

それでは実際にswitch文を使用したプログラムを作ってみましょう。

次のプログラムを皆さんの環境で動かしてみてください。

#include <stdio.h>

int main(void)
{
    //  フルーツの番号を指定
    int fruit = 0;

    switch (fruit)
    {
    case 0:
        printf("オレンジは150円です");
        break;
    }

    return 0;
}

変数fruitの値に応じてフルーツの値段が表示されるプログラムです。

では、プログラムの練習です。皆さん次のフルーツの処理を同様に追加して、変数fruitの初期値を変更しながら動作を確認してみましょう。

フルーツのIDフルーツの種別出力メッセージ
0オレンジオレンジは150円です
1バナナバナナは80円です
2桃は400円です
その他該当なし該当するフルーツはありません
ナナ
ナナ

プログラムは書いて、書いて、書いて覚えます。
頭の中だけではなく指を使って記憶を定着させてください。

スポンサー

3項演算子による分岐方法

師匠!まだ、私に隠している分岐の技がありますね。知っているんですよ。
教えてくれないなら自分で見つけますよ。私は全ての技を知り尽くしたいんです。

ナナ
ナナ

隠すつもりはないんだけど、3項演算子を使った分岐のことだよね。
使う頻度は高くないけど、使う人もいるから知っておくのは損はないね。

C言語の分岐処理には3項演算子と呼ばれる少し変わった表記方法が存在します。

書き方

 [条件式] ? [真の場合の処理] : [偽の場合の処理];

C言語において3項演算子といえばこの演算子しか存在しません。

条件式の真偽に応じて指定した処理を実施する演算子です。プログラムでは次のように使うことができます。

#include <stdio.h>

int main(void)
{
    int num1 = 30;
    int num2 = 50;
    int max;

    // 3項演算子
    // 大きい変数値をmaxへ格納
    max = num1 > num2 ? num1 : num2;

    printf("MAX:%d", max);

    return 0;
}

変数num1とnum2の大きい方をmaxに代入しています。つまり、変数maxは50が代入されます。

スポンサー

Q&A:switch文に関するよくある質問

ナナ
ナナ

switch文に関するよくある質問なんでも答えますよっ!

Q:分岐処理を書きたい時はif文とswitch文のどちらを使ったらいいの?

新しく習得した技、if文、switch文、そして3項演算子。一体どの技を使うのが一番効果的なんですか?
わたしは最高の技をもってプログラムと戦いたいんです。

ナナ
ナナ

大事なのは使い分けだよね。これが常に良いって決まるものなら分岐の技は一つしか存在してないはずだからね。釣られて技って言っちゃったよ・・・。

if文は汎用性が高く、switch文で書けることはif文で書けます。

switch文は限定的な使い方しかできないということです。基本はif文を使い、場合によりswitch文を使うと認識しておくのがよいでしょう。

switch文は変数に対する一致判定で分岐されるため、本記事の例のように変数が識別IDのようなデータを処理する場合によく使用されます。

Q:switch文のインデントの形はどれが正解?

師匠!今わたしはswitch文の技を磨いており、この技にはインデントを深くするタイプもあることを知りました。浅いのと違いはあるのでしょうか?

ナナ
ナナ

これはね、世の中に2つのタイプがいるんですよ。自分の中で統一しておくといいですね。

switch文にはcase文のインデントを浅くするタイプと深くするタイプがいます。どちらの文法でもC言語的には大丈夫ですが、自分のスタイルを決めて統一するとよいでしょう。

{
    //  インデントが浅いタイプ
    switch (fruit)
    {
    case 0:
        printf("オレンジは150円です");
        break;
    }

    //  インデントが深いタイプ
    switch (fruit)
    {
        case 0:
            printf("オレンジは150円です");
            break;
    }
}
ナナ
ナナ

私は浅いインデント派ですね。インデントが深くなるのを嫌うタイプなんです。

スポンサー

課題:switch文による分岐の使い方が学べたかを確認しよう

ナナ
ナナ

もしも、プログラムが上手く動かなくて困ったときは、答えを見るのではなく「デバッガ」の使い方を学びましょう。

この記事を見ると問題の解決技術が身に付きます。困ったときのオススメ記事です!

課題1

課題内容

次の変数を定義せよ。

データ型変数名初期値
longprefectureNo(任意の値)

prefectureNo変数の値により次の都道府県を表示せよ。switch-case文を使用して実施するものとする。表示形式は出力期待結果に従うものとする。

出力文字
1北海道
2青森
3岩手
4宮城
その他登録されていません

出力期待結果

1:北海道
2:青森
3:岩手
4:宮城
5:登録されていません

main.c

#include <stdio.h>

int main(void)
{
    long prefectureNo = 1;
//  long prefectureNo = 2;
//  long prefectureNo = 3;
//  long prefectureNo = 4;
//  long prefectureNo = 5;

    switch (prefectureNo)
    {
    case 1:
        printf("%d:北海道", prefectureNo);
        break;

    case 2:
        printf("%d:青森", prefectureNo);
        break;

    case 3:
        printf("%d:岩手", prefectureNo);
        break;

    case 4:
        printf("%d:宮城", prefectureNo);
        break;

    default:
        printf("%d:登録されていません", prefectureNo);
        break;
    }

    return 0;
}
ナナ
ナナ

case文には数値を書くのが特徴ですね。綴りが難しいですがdefault文の書き方もしっかりと身につけましょう。

課題2

課題内容

次の変数を定義せよ。

データ型変数名初期値
intnumber(任意の値)

3項演算子を使用し、number変数の値が「偶数」か「奇数」かを表示せよ。


出力期待結果

偶数:58
奇数:71

main.c

#include <stdio.h>

int main(void)
{
    int number = 58;
//  int number = 71;

    number % 2 == 0 ? printf("%d:偶数", number) : printf("%d:奇数", number);

    return 0;
}
ナナ
ナナ

3項演算子はこんな書き方もできるんです。どこまでがOKで、どこからがNGなのかいろいろ実験してみるとよいでしょう。
課題を解くだけでなく自分で実験することで身に付くのです。