お役立ち情報

switch文とは?switch文で出来ることと使い方のまとめ

Switch文!

switch文は多くのプログラミング言語に使用される概念で、プログラミング言語全般の基本的な概念になります。言うなれば、if文のようなものです。もっと言えば、switch文はif文同様に条件分岐に使うロジックなので、if文と比較して解説されることがほとんどです。

switch文はif文同様プログラミング言語の基本なのでどのプログラミング言語にも使われているのですが、今回はC言語をベースに解説していきます。ただし、C言語だから何か特殊な用法が含まれているわけではなく、たとえばJavaやSwiftなどでもほぼ使い方は同じです。

言語仕様上微妙に書き方は違いますが、ロジック自体はほぼ同じなので、C言語での使い方がわかれば後は各プログラミング言語仕様に合わせて記述するだけです。その点についてもif文同様と言えるでしょう。

ちなみにC言語を選んだ理由としては、一般的に認知されている言語のなかで古いからです。JavaやSwiftのswitch文がC言語のswitch文を参考にして作られたというわけではありませんが、先に存在したC言語の影響は少なからずあったかと思います。

C言語より古い言語ではアセンブラにもswitch文はありますが、アセンブラは誰も使っていないかと思うのでスルーすることにします。またCOBOLについてはswitch文ではなく、同じ使い方のものとしてEVALUATE文があります。

switch文の概念は古くからある概念で、新しい言語でも使われている、ということです。

switch文で出来ること

switch文で出来ることは、上記の通り条件分岐です。ここで気になるのがif文との違いですが、switch文の方がいろいろな場合にわけて処理を実装することが可能です。if文の場合、基本的に○○か○○でないか、という二つに条件分岐させます。

たとえば、フラグが立っていたら処理を行う、そうでなかったら処理を行わない、といった使い方がif文の基本です。一方で、switch文の場合並列で複数の処理パターンを用意することができます。

たとえば、フラグが1だったら1のときの処理、フラグが2だったら2のときの処理、フラグがなかったらなかったときの処理、といったイメージです。もちろんif文でもネスト(if文のなかにさらにif文を作って条件分岐を深めること)によって条件ごとの処理を実装することが可能です。

たとえば、まず一つ目のif文でフラグがあるかどうかを判定する、フラグがなかったら終了、フラグがあった場合は次のif文でフラグが1かどうか判定する、1だったら1の処理を行い、1でなかったら次にフラグが2かどうかを判定する。

2だったら2の処理を行い、2でなかった場合は例外処理を行う、といったイメージです。文章で見ていてもよくわからなくなりそうですが、要するに1つずつ比較すればif文でも複数の条件分岐が可能だということです。

しかし、複数の条件がある際にはif文で実装するのは面倒でわかりにくいです。そこで便利なのがswitch文です。

switch文の使い方

switch文の概要は上記の通りですが、実際のソースコード例を見てswitch文の使い方を確認しましょう。まずswitch文のフォームは以下のようになります。

switch(式) {
     case 値1:
          式の結果と値1が一致したときの処理
          break;
     case 値2:
          式の結果と値2が一致したときの処理
          break;
     default:
          式の結果がどの値とも一致しなかったときの処理
}

caseの後ろにそれぞれ条件を記述し、なかに処理を記述します。処理の後ろにbreakが付いていますが、これはswitch文を抜けるためのものです。breakがないとそのままswitch文のなかの処理が継続されるので、他のcaseの条件に合致しなければ最後のdefaultの処理が実行されてしまいます。

このdefaultというのはどのcaseにも当てはまらなかった場合の処理です。上記の通りbreakさせないとdefaultの処理も実行されてしまうのですが、基本的にはbreakさせるのでcaseに当てはまらなかったときのみ実行されます。

コードとしてはdefaultとなっていますが、どちらかというと例外処理の記述に使う場合が多いでしょう。caseの方に例外を書くという考え方も出来ますが、そのようなシステムはあまりないかと思います。次にサンプルコードを紹介します。

#include <stdio.h>

int main(void) {
     // サイコロの出目
     int number = 5;

     switch(number) {
          case 1:
               printf("1の目が出ました\n");
               break;
          case 2:
               printf("2の目が出ました");
               break;
          case 3:
               printf("3の目が出ました");
               break;
          case 4:
               printf("4の目が出ました");
               break;
          case 5:
               printf("5の目が出ました");
               break;
          case 6:
               printf("6の目が出ました");
               break;
          default:
               printf("numberの値が不正です");
     }
     return 0;
}

上記のソースコードを実行すると、コンソールには以下のように出力されます。

5の目が出ました

本来は最初の変数を1~6のランダムで取るかと思いますが、今回はswitch文に集中するために変数はランダムではなく5を入れました。上記のサンプルコードはswitch文を学習する際に最初によく出てくる例です。

また、ループ分のなかにswitch文を入れることも多いですが、その場合breakはループには反映されません。つまり、breakして抜けるのはあくまでもswitch文だけで、ループまで抜けるわけではないということです。

たとえば、以下のようなサンプルコードがあります。

#include <stdio.h>

int main(void) {
     // ループ回数のカウント変数
     int loopCount;
     printf("ループ開始\n");
     for(loopCount = 1; loopCount <= 3; loopCount ++) {
          // case 1へ行くswitch文
          printf("%d回目のループでswitch文開始\n", loopCount);
          switch(1) {
               case 1:
                    printf("%d回目のループでcase1 \n", loopCount);
                    break;
               case 2:
                    printf("%d回目のループでcase2\n", loopCount);
                    break;
     }
     printf("%d回目のループでswitch文終了\n", loopCount);
}
printf("ループ終了\n");
return 0;
}

上記のソースコードを実行すると以下のようにコンソール出力されます。

ループ開始
1回目のループでswitch文開始
1回目のループでcase1
1回目のループでswitch文終了
2回目のループでswitch文開始
2回目のループでcase1
2回目のループでswitch文終了
3回目のループでswitch文開始
3回目のループでcase1
3回目のループでswitch文終了
ループ終了

まずswitchの後ろのかっこには1が入っているので、case1にしか行かない仕様になっています。そしてループカウントを加算、出力しながらループを回しているのですが、1回目のcase1のbreakを実行しても、ループ自体は抜けないという確認でした。

1回目のループでbreakしても2回目のループが回ってくるという非常に簡単な確認だったのですが、重要な概念です。他にもswitch文には応用的な使用法がありますが、まずは今回紹介した基本を押さえ、必要であればその都度調べてみてください。

キャリアカウンセリングのプロとして
あなたに合った案件をご案内します。

まずはお気軽にお問い合わせください!

イメージ