KID's World
 

おしながき
トップページ
プログラミング
研究
いんすぴ
色日記
ソフトウェア
KID's Worldの歴史
リンク
小出俊夫について


最後の制御文−switch文

switch文の構造を知る

 

switch文 〜数値によって行き先を変える〜

 前ページでは、条件によって制御の流れを変える if文を知りました。ということは、変数aが1の時はこれ、2の時はこれ、1でも2でも無い時はこれを実行するということもできますね。では、そういうプログラムを書いてみたいと思います。

 
#include <stdio.h>

main()
{
  int a = 1;

  if (a == 1){
    printf("aは1です。\n");
  }
  else{
    if (a == 2)
      printf("aは2です。\n");
    else
      printf("aは1でも2でもありません。\n");
  }
}

 この場合は1か2かそうではないかだけしか評価しないのでこの程度で済みますが、3か、4か...と増えていくと、もうわけが分からなくなってしまいます。そんな時に便利なのが switch文です。

 switch文は、「数値によって別々の仕事をする」という作業のみに特化した制御文で、if文では繁雑になりやすいソースコードを簡単に分かりやすくしてくれるものです。

 
switch(式){
  case 定数式1: 文11 文12...
  case 定数式2: 文21 文22...
 ・・・
  case 定数式n: 文n1 文n2...
  default: 文12...
}

 これだけ見ると、何のことやら分かりませんが、ソースを見てみれば何となく分かるはずです。

 
#include <stdio.h>

main()
{
  int a = 1;

  switch(a){
    case 1:  printf("aは1です。\n");
    case 2:  printf("aは2です。\n");
    default: printf("aは1でも2でもありません。\n");
  }
}

 この場合、aが1のときは「printf("aは1です。\n");」が、aが2のときは「printf("aは2です。\n");」が、そして1でも2でも無かったときは「printf("aは1でも2でもありません。\n");」が実行されます。

 と言いたいところなのですが、そうはいかず、この例の場合は、

 
aは1です。
aは2です。
aは1でも2でもありません。

と、ぜーんぶ表示されてしまいます。一体何が起きたのかというと、変数aには1が入っているので、制御は「case 1:」以降に移されるのですが、その後にcase文が来ても、処理を続行してしまうためです。そのため、while文のところで紹介したbreak文を使ってこの例を以下のように書き換えなくてはなりません。

 
#include <stdio.h>

main()
{
  int a = 1;

  switch(a){
    case 1: printf("aは1です。\n"); break;
    case 2: printf("aは2です。\n"); break;
    default: printf("aは1でも2でもありません。\n"); break;
  }
}

 このことを利用すれば、「aが1,3,4の時」に実行する文も簡単に作ることができます。

 
#include <stdio.h>

main()
{
  int a = 1;

  switch(a){
    case 1:
    case 3:
    case 4: printf("aは1か3か4です。\n"); break;
    case 2: printf("aは2です。\n"); break;
  }
}

 この例では「default」をなくしてしまいましたが、これでも大丈夫です。このとき1から4以外の数値がaに入っていた場合は何も実行する文が無いので、表示されないのは言うまでもありませんね。

 さぁこれで制御文の説明は終わりました。これで少しは凝ったプログラムが作れるようになったことと思います。…え? 文字を表示するのは分かったけどキーボードから入力するのはどうするかって? それはまだちょっと…。これをちゃんと理解するのは難しい…。

 

まとめ。

  1. コンパイラは空白文字を無視するから、場合によっては単純なバグの原因がいつまでたっても分からない事もある。
  2. switch文は、指定された式によって、いくつも分岐する制御文。
  3. caseの最後にbreak文を書かないと、次のcaseも実行してしまう。

(1997/01/30 公開, 1999/03/13 改)

[目次へ] [次へ]

 著作権は全て小出 俊夫にあります。KID's World © 1996-2003 Toshio Koide.

 対応ブラウザについて