この記事の要点
- switch文(switch-case文)とは、条件分岐を記述する際に使う処理の一種
- 1つの値に応じて多数に条件分岐するときはswitch文、それ以外の場合はif文を使う
- フォールスルーを使って、複数のcaseで同じ処理を実行できる
switch文は、C言語の条件分岐を記述する際に使う、基本的な処理です。
しかし、if文を先に学ぶことが多く、大抵の場合if文のみで対処できるため、switch文の使いどころがわからない初心者の方も多いのではないでしょうか。
当記事では、switch文の使い方や、if文との使い分け、また応用テクニックとして、enumやフォールスルーをご紹介します。
当記事を読めば、C言語のswitch文の使い方を忘れてしまった方や、enum、フォールスルーってなに?という方の疑問を解消できます。
switch文とは
switch文(switch-case文)は、条件分岐を記述する際に使う処理の一種です。
さらに詳しくいうと、
“ある値について、その値が○○なら処理Aを、△△なら処理Bを、□□なら処理Cを実行する”
というような場面で使います。
例えば、テレビのリモコンをイメージしてください。
ボタンには1から12までの数字が振られていて、押した数字によって番組が変わりますよね。
それをC言語のswitch文で表現すると、次のようになります。
int input = 0; // ユーザからの入力を受け取る scanf("%d", &input); switch(input){ case 1: puts("A放送"); break; case 2: puts("B放送"); break; case 3: puts("C放送"); break; case 4: puts("D放送"); break; default: puts("このチャンネルには対応していません"); break; }
このようにすると、
ユーザの入力が1なら「A放送」を出力、2なら「B放送」を出力、3なら...
というように、入力に応じて違う処理を実行できます。
if文との使い分け
C言語では、同じく条件分岐の記述方法として、if文があります。
switch文との使い分けは、
1つの値に応じて多数に条件分岐するときはswitch文、それ以外の場合はif文を使う
と覚えましょう。
先ほどのswitch文をif文で記述すると、次のようになります。
int input = 0; // ユーザからの入力を受け取る scanf("%d", &input); if (input == 1) { puts("A放送"); } else if (input == 2) { puts("B放送"); } else if (input == 3) { puts("C放送"); } else if (input == 4) { puts("D放送"); } else { puts("このチャンネルには対応していません"); }
好みの問題もあるかもしれませんが、switch文で記述した時よりごちゃごちゃした印象です。
if文は、複雑な条件分岐にも対応しやすい反面、分岐が多くなると読みづらくなっていきます。
一方switch文では、
if ( a == 1 || b == 0 && c == 2)
のような複数の値が絡む複雑な条件分岐への対応は難しくなります。
if文、switch文、どちらも一長一短なので、適切に使い分けるようにしましょう。
switch文の基本
switch文は、次のような構文になっています。
switch(整数値){ case ラベル1: 処理 break; case ラベル2: 処理 break; ・・・ default: 処理 break; }
ポイントは以下の通りです。
- switchの()内に指定した値と、各case文で指定したラベル(値)が一致したら、そのcase内の処理へジャンプする
- 各case文で指定したどのラベルにも一致しない場合、default内の処理へジャンプする
- breakに到達したら、switch文を抜ける
- case内にbreakがない場合、その次のcaseやdefault内の処理を実行する
特に、breakを書き忘れて意図しない処理になってしまうのは、初心者あるあるなので、注意しましょう(ただし、後に説明するフォールスルーのように、意図的にbreakを記述しないことはあります)。
「default」の使い方
defaultは、switchの()内に指定した値が、各case文で指定したどのラベル(値)にも一致しないときの処理を記載するために使います。
先ほどのリモコンのコード例でいうと、次の部分です。
default: puts("このチャンネルには対応していません"); break;
リモコンのボタンは、全てのボタンにチャンネルが振られているとは限りません。
また、今回のサンプルでは、「a」のような文字が入力されるかもしれません。
そのような場合に備えて、defaultを使い、入力に対応するチャンネルがないときは「このチャンネルには対応していません」と出力するようにしています。
switch文で使えるデータ型
C言語では、switchの()内やcase文のラベルに指定できるのは、intやshortなどの整数値のみです。
doubleやfloat、文字列等は使用できません。
ただし、char型は内部的には整数でデータを持っているので、使用できます。
enum(列挙型)について
やや発展的な内容になりますが、switch文ではenum(列挙型)を使うこともできます。
enumとは、定数を列挙してまとめたもので、次のように定義します。
enum enumの名前 {定数1, 定数2, ・・・};
先ほどのリモコンの例なら、次のようになります。
enum Channel { A_Broadcaster = 1, B_Broadcaster = 2, C_Broadcaster = 3, D_Broadcaster = 4 }; enum Channel ch = A_Broadcaster; switch(ch){ case A_Broadcaster: puts("A放送"); break; case B_Broadcaster: puts("B放送"); break; case C_Broadcaster: puts("C放送"); break; case D_Broadcaster: puts("D放送"); break; default: puts("このチャンネルには対応していません"); break; }
こちらを実行すると、「A放送」と出力されます。
enumを使ったことで、「放送局」と「放送局に対応するチャンネルの数字」の紐づけをわかりやすく管理できるようになりました。
余裕がある方はenumについても学習してみましょう。
フォールスルーとは
フォールスルーとは、意図的にbreakを書かずに、次のcaseやdefaultの処理を連続して実行するテクニックです。
当記事で何度も登場している、リモコンの具体例を見ていきましょう。
リモコンでは複数のボタンに同じ放送局が割り当てられていることがありますよね。
ここでは、1チャンネルと5チャンネルにA放送が割り当てられているとします。
それをコードで表現すると、次のようになります。
int input = 0; // ユーザからの入力を受け取る scanf("%d", &input); switch(input){ case 1: // フォールスルー case 5: puts("A放送"); break; case 2: puts("B放送"); break; // 以下省略 }
このコードでは、入力値が1の場合と、5の場合に、「A放送」が出力されます。
このように、あるcaseと、別のcaseで、同じ処理を実行したいときは、フォールスルーが役に立つので、覚えておくとよいでしょう。
まとめ
当記事では、switch文の使い方について解説しました。
if文で書くとごちゃごちゃしてしまう条件分岐でも、switch文を使うとすっきり書ける場合があります。
1つの値に応じて多数に条件分岐するときはswitch文、それ以外の場合はif文を使う
という原則を覚えて、うまく使い分けられるようになりましょう。
他にも、C言語初心者の方がつまずきやすいポイントとして「ポインタ」があります。
ポインタが難しいと感じている方や、ポインタの使い方やメリットがわからないという方に向けて、ポインタを効果的に習得する方法を紹介していますので、参考にしてください。
また、「配列」もポインタと混同されやすい、初心者がつまずきやすいポイントの1つです。
ポインタとの違い、初期化、コピーの方法、要素数の取得、引数への渡し方、多次元配列といった、初心者必修の基礎テクニックをわかりやすく解説していますので、こちらも参考にしてください。