C言語のswitch-case文で条件分岐を行う方法

395, 2022-01-24

目次

C言語のswitch-case文の書き方

C言語には色々な文があります。
if文、for文、return文……。
その中にswitch文switch-case文)という文もあります。

このswitch文は変数が特定の値だった時に、その値用の処理にジャンプして処理を行える文です。
switch文にはcaseやdefault, break文も使われます。

この記事ではC言語のswitch文について詳しく解説します。

関連記事

switch文の構造

switch文は↓のような構造になっています。

switch (変数) {
case 値1:
    ~処理~
    break;
case 値2:
    ~処理~
    break;
default:
    ~処理~
    break;
}

switch文は最初にswitchというワードを書きます。
そしてその後のカッコの中に変数を置きます
switch文をその変数の値を見ます。
そしてその値が書かれたcaseにジャンプします
caseにジャンプしたら処理を実行します。
そしてbreak文でswitch文から脱出します。

caseと一緒に値を書いておくと、switch文の分岐を増やすことができます。
↑の例ではcase 値1:case 値2:の2つになってます。

それからdefaultですが、ここにはいずれのcaseの値にもマッチしなかった場合にジャンプします。
つまりカッコの中の変数の値が値1でも値2でも無かった場合にdefaultにジャンプします。

switch文ではcasedefaultの処理が終わったらbreak文を書いておくという約束事(守らない場合もある)があります。
これはswitch文から脱出するためです。
breakを書かない場合はそのまま下のほうに処理が移動します。

int変数のswitch文を書く

それでは実例としてint型の変数を使ってswitch文を書いてみます。

#include <stdio.h>

int main(void) {
    int n = 2;

    switch (n) {
    case 1:
        puts("1です");
        break;
    case 2:
        puts("2です");
        break;
    default:
        puts("1でも2でもありません");
        break;
    }

    return 0;
}

↑のコードをコンパイルして実行すると↓の結果になります。

2です

↑のコードですが、まずmain関数内でint型の変数nを定義しています。

    int n = 2;

この変数をswitch文に使います。
switchの後のカッコの部分にnを置きます。

    switch (n) {
        ...
    }

変数nの値は2です。
そのためswitch文はcase 2:ジャンプします。

    ...
    case 2:
        puts("2です");
        break;
    ...

case 2:の処理ではputs()関数で「2です」と出力しています。
出力が終わったらbreak文でswitch文から抜け出します。

変数nの値を1に変えるとcase 1:にジャンプします。
またnの値を34にした場合はdefault:にジャンプします。
変数の値を変更して色々実験してみてください。

switch文で使える変数の型

switch文で判定できる変数の型は、整数のみです
そのため実数や文字列は使うことができません。

    switch (1.23) {
        // コンパイルエラー
    }

    switch ("string") {
        // コンパイルエラー
    }

enumの定数は整数扱いなのでswitch文に使うことができます。

#include <stdio.h>

enum {
    ONE = 1,
    TWO = 2,
};

int main(void) {
    switch (ONE) {
    case ONE:
        puts("1です");
        break;
    case TWO:
        puts("2です");
        break;
    }

    return 0;
}

↑のコードはコンパイルして実行すると「1です」と出力されます。

caseとdefaultの順番

switch文のcaseとdefaultは順番は決められていません。
ですので好きなように書くことができます。
たとえば

switch (n) {
case 1:
    // 処理
    break;
default:
    // 処理
    break;
}

だったり、

switch (n) {
default:
    // 処理
    break;
case 1:
    // 処理
    break;
}

だったりです。

defaultを先に書いておいたほうがわかりやすいという人もいますし、そうでないという人もいます。
ここら辺は好みになりそうです。
ただcaseが多くなる場合はdefaultは先頭に書いたほうがいいかもしれません。

フォールスルー・テクニック

switch文ではbreak文を書かないとswitch文からただちに脱出できません。
この特性を利用したのが「フォールスルー」です。

switch (n) {
case 1:  // fallthrough
case 2:  // fallthrough
case 3:
    printf("%d\n", n);
    break;
}

↑のswitch文では変数nの値が1だった場合、case 1:にジャンプします。
しかしcase 1:にはbreak文が書かれていません。
そのためswitch文から脱出せずにそのまま下の処理(case 2:)に進みます。

case 2:にもbreak文が書かれていません。
そのため下の処理(case 3:)に移動します。

このようにフォールスルーを利用すると複数の値の処理をひとつのcaseにまとめることができます
これはわりとよく使われるテクニックなので覚えておきましょう。

おわりに

今回はC言語のswitch-case文について解説しました。
switch文を使うと処理をコンパクトにできることもあります。

(^ _ ^)

switch文でコードをかっこよくしよう

(・ v ・)

if文も思い出してあげてね



この記事のアンケートを送信する