C言語のswitch文とは ~複数の条件分岐~

ゴンチチ

ゴンチチ

開発エンジニア/ボールド歴1年

C言語のswitch文とは、複数の条件分岐を行うための構文です。
整数値を条件として条件分岐を行いますが、複数の条件に対して同じ処理を実行したり、整数値の代わりに文字列を使用した条件分岐を行うこともできます。

この記事ではswitch文の使い方について解説し、文字列で条件を指定する方法や。同様な条件分岐を行う構文であるif文との違いについて解説します。


1. C言語のswitch文とは

switch文とは、条件によって異なる処理を実行することができる構文です。
条件による分岐が複数ある場合にも使用できます。


2. switch文の使い方

C言語のswitch文の書式、switch文を使った条件分岐による処理の方法と、処理を制御する方法について解説します。

2-1.switch文の書式

switch文は、条件式を「()」で囲い、条件分岐により実行する処理を「{}」で囲って記述します。

switch (条件式) {
    case 値1:
        //条件式の結果が値1である場合に実行する処理
        break;
    case 値2:
        //条件式の結果が値2である場合に実行する処理
        break;
    case 値n:
        //条件式の結果が値nである場合に実行する処理
        break;
    default:
        //条件式の結果がどの値とも一致しない場合に実行する処理
}

 

条件式は処理の開始時に評価され、その結果に応じて、値nの場合に「case 値n」以降に記述された処理を実行します。
条件式の結果が値1から値nのどの値とも一致しない場合は「default」以降に記述された処理を実行します。条件式の結果である値1から値nは整数値である必要があります。
浮動小数点数の値や文字列を使用することはできません。ただし、後述の方法を使って文字列に整数値を割り当てることで、文字列を条件として使用することができます。

「default」の記述は省略することができますが、省略した場合、条件式の結果がどの値とも一致しない場合は何も処理が実行されません。

2-2.switch文による条件分岐

switch文では、条件式の結果に従って処理が実行されます。
1から7までの値に応じて曜日を出力する処理をswitch文で記述する例を以下に示します。

#include 

int main(void){
    int i=2;

    switch (i) {
        case 1:
printf(“月曜日\n”);
break;
        case 2:
printf(“火曜日\n”);
break;
        case 3:
printf(“水曜日\n”);
break;
        case 4:
printf(“木曜日\n”);
break;
        case 5:
printf(“金曜日\n”);
break;
        case 6:
printf(“土曜日\n”);
break;
        case 7:
printf(“日曜日\n”);
break;
        default:
            printf(“無効な値\n”);
    }

    return 0;
}

実行結果は以下の通りです。

火曜日

switch文の実行が開始されると、条件式の結果に従ってiが1であれば「case 1」の後に記述されたprintf関数の処理を、iが2であれば「case 2」の後に記述されたprintf関数の処理を実行する、というように iの値に応じた位置から処理を実行します。
その後、break句に従ってswitch文の処理を抜けます。iが0以下または8以上の場合は、switch文のどの値にも当てはまらないため、「default」の後に記述されたprintf関数の処理を実行してswitch文の実行を終わります。

そのため、iが2の場合は”火曜日”が出力されます。
「case」や「default」の後ろにはセミコロン「;」ではなくコロン「:」を付けますので注意してください。

2-3.break句の有無による動作の違い

switch文の書式では「case」の処理ごとにbreak句を記述していますが、break句を記述しなくてもswitch文の処理を実行することができます。

break句を記述しない場合の、break句を記述する場合の動作との違いについて解説します。
1から7までのうち、1から5の場合に”平日”、6と7の場合に”休日”と出力する処理をswitch文で記述する例を以下に示します。

#include 

int main(void){
    int i=2;

    switch (i) {
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
    printf(“平日\n”);
    break;
case 6:
case 7:
    printf(“休日\n”);
break;
        default:
            printf(“無効な値\n”);
    }

    return 0;
}

実行結果は以下の通りです。

平日

switch文の実行が開始されると、条件式の結果に従った「case 値」の後に記述された処理を実行しますが、次の「case 値」の前にbreak句の記述がない場合は、break句またはswitch文の最後にたどり着くまで記述された処理を順次実行します。
「case 値」が条件式の結果と一致しない箇所の処理であっても実行します。そのため、iが2の場合は「case 2」の後から処理を開始し、「case 5」の後のprintf関数の処理を実行して”平日”が出力され、break句でswitch文の処理を抜けます。

このような処理の制御を「フォールスルー」と呼びます。
switch文ではこのフォールスルーにより、条件式の結果に応じて「case 値」で区切られたブロックに記述された処理のみを実行するのではなく、「case 値」の位置にジャンプして、そこから処理を順次実行していきます。
「case」は、C言語やWindowsコマンドプロンプトのgoto文に出てくる、ラベルのようなものと考えるとわかりやすいと思います。

フォールスルーを利用することで、条件式の複数の値について同じ処理を実行することができますが、
条件式の値ごとに異なる処理を実行したい場合にbreak句を記述し忘れると、意図しない処理が実行されますので注意してください。


3. 文字列による条件指定

C言語のswitch文は整数値で条件を指定する必要がありますが、列挙型と呼ばれるデータ型を使用して、文字列に整数値を割り当てることで、文字列をswitch文の条件として使用できます。

列挙型は、整数値を割り当てる文字列(列挙子)を「{}」で囲って定義します。

enum 列挙型名 {
    列挙子名 = n,
    列挙子名
};

nは整数値で、各列挙子にはnから順番に整数値が割り当てられます。整数値を指定しない場合は0から順番に整数値が割り当てられます。先頭以外の列挙子についても「=」で整数値を指定することができます。
列挙型(enum)を使用し、Mon, Tue, Wed, Thu, Fri, Sat, Sunの文字列に応じて曜日を出力する処理をswitch文で記述する例を以下に示します。

#include 

int main(void){
    enum weekday {
        Mon,
        Tue,
        Wed,
        Thu,
        Fri,
        Sat,
        Sun
    };

    enum weekday w=Tue;

    switch (w) {
        case Mon:
printf(“月曜日\n”);
break;
        case Tue:
printf(“火曜日\n”);
break;
        case Wed:
printf(“水曜日\n”);
break;
        case Thu:
printf(“木曜日\n”);
break;
        case Fri:
printf(“金曜日\n”);
break;
        case Sat:
printf(“土曜日\n”);
break;
        case Sun:
printf(“日曜日\n”);
break;
        default:
            printf(“無効な値\n”);
    }

    return 0;
}

実行結果は以下の通りです。

火曜日

ここでTueは列挙型で定義された列挙子名であるため、「”」で囲む必要はありません。


4.if文との違い

C言語で条件分岐による処理を実行する構文として、switch文の他にif文があります。書式は異なりますが、switch文はif文で書き換えることができます。
1から7までの値に応じて曜日を出力する処理をif文で記述する例を以下に示します。

#include 

int main(void){
    int i=2;

    if (i==1) {
printf(“月曜日\n”);
    } else if (i==2) {
printf(“火曜日\n”);
    } else if (i==3) {
printf(“水曜日\n”);
    } else if (i==4) {
printf(“木曜日\n”);
    } else if (i==5) {
printf(“金曜日\n”);
    } else if (i==6) {
printf(“土曜日\n”);
    } else if (i==7) {
printf(“日曜日\n”);
    } else {
        printf(“無効な値\n”);
    }

    return 0;
}

switch文の「case」をif文やelse if文の条件式とし、「default」の処理を最後のelse文の処理として記述することによりif文に書き換えています。

switch文でもif文でも条件分岐による処理を実行することができますが、その違いは条件分岐と条件式の数です。switch文は1つの条件式に対して3つ以上の条件分岐をまとめて記述することができ、条件分岐の数が多い場合に向いている構文です。
一方でif文は条件分岐ごとに異なる条件式を記述することができ、複数の条件式に応じた処理を実行する場合に向いている構文です。


5.まとめ

C言語のswitch文の書式、条件分岐による処理の記述方法や制御方法と、同様な処理を実行することができるif文との違いについて解説しました。
条件分岐による処理は、C言語によるプログラミングの基本となる処理のひとつです。
状態遷移図など条件式に対して複数の分岐が発生するような処理を実行することができ、break句の有無で条件分岐ごとに処理する内容を制御することができますので、ぜひ身につけてください。

私たちは、全てのエンジニアに市場価値を高め自身の望む理想のキャリアを歩んでいただきたいと考えています。もし、今あなたが転職を検討しているのであればこちらの記事をご一読ください。理想のキャリアを実現するためのヒントが見つかるはずです。

『技術力』と『人間力』を高め定年まで働けるエンジニアを目指しませんか?

私たちは「技術力」だけでなく「人間力」の向上をもって、エンジニアとしてだけでなくビジネスパーソンとして高い水準を目指し、社会や顧客に必要とされることで、関わる人々に感動を与える集団であろうと思っています。

  • 定年までIT業界で働くためのスキルが身につく「感動大学」と「技術勉強会」!
  • 「給与が上がらない」を解消する6ヶ月に1度の明確な「人事評価制度」!
  • 理想のエンジニア像に近づくためのよきアドバイザー「専任コーチ制度」!
  • 稼動確認の徹底により実現できる平均残業時間17時間の働きやすい環境!

現在、株式会社ボールドでは「キャリア採用」のエントリーを受付中です。

まずは以下のボタンより弊社の紹介をご覧いただき、あなたの望むキャリアビジョンをエントリーフォームより詳しくお聞かせください。

コメント

IT業界を目指す求職者へ

プレミアムSES®で市場価値の高いエンジニアへ

株式会社ボールドが約束する5つのプレミアムとは?

IT業界を目指す求職者へ

プレミアムSES®で市場価値の高いエンジニアへ

株式会社ボールドが約束する5つのプレミアムとは?