ユーニックス総合研究所

  • home
  • archives
  • c-case

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

  • 作成日: 2022-01-23
  • 更新日: 2023-12-25
  • カテゴリ: C言語

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

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

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

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

関連記事

目が覚めるC言語のdo-while文の使い方【ループ処理、初心者向け】
明快!C言語のcontinue文の使い方
君はまだC言語のdefineのすべてを知らない【マクロ、プリプロセス】
プログラミングのポインタをわかりやすく解説【C言語】
コードで見るC言語とC++の7つの違い

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文でコードをかっこよくしよう

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