switch文「〜の時はこう!」 | 技術者が教える初心者さんのためのC言語

技術者が教える初心者さんのためのC言語

〜最小限の知識でプログラム〜

いつも感謝しています。Nです。

if文「もし~だったら・・・」else「そうでなくて!」の記事で、この"if"とか"else"を使うことで、その条件に応じて処理を分岐できるというお話をしました。

今日は、switch文についてお話したいと思います。

このswitch文も、カテゴリー的にいうと条件分岐のためのものです。

しかし、私は初心者のときに混乱しました。

「同じようなことをするのに、何故色々と方法があるの?」
「条件分岐とか言って、ifとかswitchとかあって、使い分けの基準は?」
などなど。

今日は、この使い分けの基準はどうするのかについても述べていこうと思います。

では、具体的に述べて行きます。

まずは、switch文は以下のように書きます。

◆switchの型
switch( 変数 )
{
    case  値1:
  処理1;
  break;
    case  値2:
  処理2;
  break;
    case  値3:
  処理3;
  break;
 ・
 ・
 ・
    case  値n:
  処理n;
  break;
    default:
  処理;
        break;
}



switch( 変数 )の部分では、「この変数の値が、」という意味になります。
case  値**: の部分では、「値**であるときこうしなさい」という意味になります。
処理**の部分では、こうしなさいという実際の処理を記載します。
break:の部分では、「switch文を終了しなさい」という意味になります。

default:
  処理;
  break;
の部分では、「どのcaseにもならないときは、ここの処理を実行しなさい」という意味になります。

switch文を使ったプログラムを実際に書いてみますね。
たとえば、順位に応じて、メダルの色を表示するプログラムを考えると、

int  main( void )
{
 int   rank;    /*  順位 */

 rank = 1;    /* 今回は順位に1を代入 */

 switch( rank )
    {
     case 1:    /* 順位が1位 */
  /*  金メダルと表示 */
         printf("Gold !!!¥n");
  /*  switch文をぬける(break!終了) */
         break;
     case 2:    /* 順位が2位 */
  /*  銀メダルと表示 */
         printf("Silver!!¥n");
  /*  switch文をぬける(break!終了) */
         break;
     case 3:    /* 順位が3位 */
  /*  銅メダルと表示 */
         printf("Bronze!¥n");
  /*  switch文をぬける(break!終了) */
         break;
     default:   /*  それ以外 */
  /*  メダル無しと表示 */
         printf("Nothing…¥n");
  /*  switch文をぬける(break!終了) */
         break;
     }
     return( 0 );
}

のように書けます。

つまり、switch文は、switch( 変数 )の変数の値が、「~の時はこう!」という処理を記載していきます。

上の例だと、順位rankの変数が1なので、case の後の数字が一致するcase 1: に記載されている処理を行います。

仮に変数の値が2の時は、case 2:に記載されている処理を、変数の値が3の時は、case 3:に記載されている処理、それ以外の変数の値のときは、default:に記載されている処理をしなさいというプログラムになります。

また、1位、2位、3位、99位の人には花束をあげるというような同じ処理をする場合には、caseを重ねて以下のように書くこともできます。

int  main( void )
{
 int   rank;    /*  順位 */

 rank = 1;    /* 今回は順位に1を代入 */

 switchrank )
    {
     case 1:    /* 順位が1位 */
     case 2:    /* 順位が2位 */
     case 3:    /* 順位が3位 */
     case 99:  /* 順位が99位 */
  /*  花束あげる */
         printf("We will give you flower !¥n");
  /*  switch文をぬける(break!終了) */
         break;
     default:   /*  それ以外 */
  /*  花束無し */
         printf("Nothing…¥n");
  /*  switch文をぬける(break!終了) */
         break;
     }
     return( 0 );
}

switch文の文法については、ここまでを押さえておけばよいと思います。

さて、上記の例(金、銀、銅、無し)をif文でも書いてみましょう。

int  main( void )
{
 int   rank;    /*  順位 */

 rank = 1;    /* 今回は順位に1を代入 */

   if( rank == 1 )
   {
        printf("Gold !!!¥n");
   }
   else if( rank == 2 )
   {
         printf("Silver!!¥n");
   }
   else if( rank == 3 )
   {
         printf("Bronze!¥n");
   }
   else
  {
         printf("Nothing…¥n");
   }
   return( 0 );
}

そう、書けてしまうんですよね。そしてこれが、書けるのだったら、どっちを使えばよいの?使い分けの基準は?という混乱が生じてしまうんですよね。

ここで思い出して欲しいのが、記事「面倒くさがり屋さんは素質がある」です。

プログラムを整理するポイント
1: 同じようなコードを何度も書いているところは無いか
2: 思考の流れが止まってしまうところは無いか

上記のif文だとrankというのを何度も書いている。
更に、if文は「もし~だったら」という思考、switch文は「~の時はこうする」という思考
です。

上記のプログラムのswitch文とif文の思考を言葉で表すと、
switchの場合は
「1位の時は、case1を実行」
「2位の時は、case2を実行」
「3位の時は、case3を実行」
「それ以外は、defaultを実行」
if文の場合は、
「順位が1位ならば、~を実行」
「そうでなくて、順位が2位ならば、~を実行」
「そうでなくて、順位が3位ならば、~を実行」
「そうでない場合は、~を実行」
となります。

今回のように、あらかじめ「値がこの時はこう」と分かっている場合は、switch文の方が思考の流れが途絶えません。また、後で新しい値が出てきたときも、switch文の方がコードを修正しやすいです。

まとめると、

1:   「一つの変数の値」に応じて、処理を変える場合
2: 「値がこの時はこう!」とある程度事前に分かっている場合
3:  「新しい値の時の処理が後で追加になる可能性」がある場合


はswitch文を使うと思ってもよいと思います。

例えば、ロボットの状態に応じて処理を振り分ける場合とかは、このswitch文を使うと非常にプログラムそして思考が整理されます。

ロボットのプログラム設計段階で、ロボットの状態を大きく分けて5段階に分けたとします。プログラムをしている段階で、もしかしたらロボットの状態を更に細分化するかもなぁと考えたとします。

この場合、ロボットの状態を1の時は、10の時は、20の時は、30の時は、40の時はと飛び飛びでswitch文を作ります。そして後で1の動作をもう少し細分化したいなと思ったら、2の時は、3の時はと追加することもswitch文なら楽にできてしまいます。

イメージ的なプログラムとしては、
int main( void )
{
    int  robotSts;   /*  ロボット状態 */

    switch( robotSts )
 {
     case 1:
         /* ロボットの状態が1の時の処理 */
         break;
     case 2:
         /* ロボットの状態が2の時の処理(1の処理を更に細分化の為追加) */
         break;
     case 3:
         /* ロボットの状態が3の時の処理(1の処理を更に細分化の為追加) */
         break;
     case 10:
         /* ロボットの状態が10の時の処理 */
         break;
     case 20:
         /* ロボットの状態が20の時の処理 */
         break;
     case 30:
         /* ロボットの状態が30の時の処理 */
         break;
     case 40:
         /* ロボットの状態が40の時の処理 */
         break;
     default:
         /* ロボットの状態がそれ以外の時の処理 */
         break;
    }
 return( 0 );
}

のようになります。

以上、今日は色々書きましたが、初心者の方はまずはswitch文の型を知っておくこと、
意味は「~の時はこう!」なんだということを押さえておけば良いと思います。

実際にプログラムをされている方で、あまりswitch文を使ってなかった方は、switch文を使うことで、思考が整理される書き方ができるかなぁと考えてみてくださいね。