ものづくりBLOG blog page

第8章 何もしない(7):制御文−switch文

2011-01-01 (Sat) 08:00
H8+C言語入門:第8章 何もしない(7):制御文−switch文
 
 第8章でも、やはり何もしないプログラムの作成が続きます。
 第7章では、一つの評価の結果から二つの選択をするというもの、if文を学習しました。
 そのif文と先に学習した繰り返しの制御文があれば、ほとんどのプログラムが作成可能で
 す。第8章で紹介するswitch文は、一つの評価から、その結果に応じて、実行したい文を
 切り替える際に使います。if文でこれを実現することは、勿論可能なのですが、if文をたく
 さん記述していかなければならないので、かなり面倒になります。それをswitch文で、す
 っきりと記述します。
 
 switch文は、次の様な基本的な構文を持っています。
  switch( 式 ){
   case 定数式1: 文1
   case 定数式2: 文2
    :
   case 定数式n: 文n
   default: 文
  }
 これが基本形です。
 「式」の値が「定数式1」ならば、「文1」を実行し、「定数式2」ならば「文2」を実行
 します。どの定数式に当てはまらない時は、「default」のところの「文」を実行します。
 
<サンプル7-1>
void main(void)
{ /* main関数の始まり */
int i, j; //変数iとjの宣言
i = j = 0; //変数i、jの初期化:0をセットする。
for(;;){ //無限ループ:ブロック始点
if( i >= 10 ) break; //iが10以上になったら、for文を抜ける。
switch( i ){
case 1:
j = 10;
case 2:
j = 20;
case 3:
j = 30;
default:
j = 1000;
}
i++; //iをインクリメントする。
} //無限ループ:ブロック終点
} /* main関数の終わり */
 
 この結果は、どうなるか分かりますか?
 iが0の時は、1でも、2でも、3でもないので、defaultのところの文が実行され、jには、
 1000がセットされます。
 次に、iが1の時はどうなるか・・case 1のところの条件に一致するので、jには、10がセ
 ットされます・・が、問題は次です。switch文の場合、次の行の処理を実行しようとしま
 す。case 2がありますが、これは無視され、「j = 20」が実行されます。ということで、
 順々に処理が下に向かって処理されて・・最後には、「j = 1000」となります。
 処理の期待としては、case 1で10がセットされて、そのまま・・というのがありますが、
 そうは動きません。そこに一工夫が必要になってきます。case 1の処理が終わったら、
 処理を中断して、case 2以降に行かない様にしたい・・そう、break文を使いましょう。
 サンプル7-1を次の様に書き直すと期待通りの動き担います。
 
<サンプル7-2>
void main(void)
{ /* main関数の始まり */
int i, j; //変数iとjの宣言
i = j = 0; //変数i、jの初期化:0をセットする。
for(;;){ //無限ループ:ブロック始端
if( i >= 10 ) break; //iが10以上になったら、for文を抜ける。
switch( i ){ //式は、iの値を評価する。ここがswitch分のブロック始点。
case 1: //iが1の時は、
j = 10; //jに10をセットする。
break; //case 1の処理をここで中断
case 2://iが2の時は、
j = 20; //jに20をセットする。
break; //case 2の処理をここで中断
case 3://iが3の時は、
j = 30; //jに30をセットする。
break; //case 3の処理をここで中断
default://iが条件に何も一致しない時は、
j = 1000; //jに1000をセットする。
break; //defaultの処理をここで中断
}ここがswitch文の終点
i++; //iをインクリメントする。
} //無限ループ:ブロック終端
} /* main関数の終わり */
 
 これをif文で書き直してみましょうか。
 (やはり、ちょっとたいへんですぞ)
 
<サンプル7-3>
void main(void)
{ /* main関数の始まり */
int i, j; //変数iとjの宣言
i = j = 0; //変数i、jの初期化:0をセットする。
for(;;){ //無限ループ:ブロック始端
if( i >= 10 ) break; //iが10以上になったら、for文を抜ける。
if( i == 1 ){ //iが1だったら、
j = 10; //jに10をセットする。
} else { //iが1以外だったら、以下を実行する。
if( i == 2 ){ //iが2だったら、
j = 20; //jに20をセットする。
} else { //iが2以外だったら、以下を実行する。
if( i == 3 ){ //iが3だったら、
j = 30; //jに30をセットする。
} else { //iが3以外だったら、以下を実行する。
j = 1000; //jに1000をセットする。
}
}
}
i++; //iをインクリメントする。
} //無限ループ:ブロック終端
} /* main関数の終わり */
 
 どうですか、一見して。分かりにくいでしょう?
 この場合は1か2か、3、そうではないかだけしか評価しないのでこの程度で済みますが、
 この条件が増えていくと・・elseのところがどんどん深くなって、もうわけが分からなく
 なってしまいます。そんな時に便利なのが switch文なのです。
 switch文は、「数値によって別々の処理をする」という制御に特化した制御文で、if文で
 は、繁雑、複雑になりやすいソースコードを簡単に分かりやすくしてくれます。
 
 では、実際にH8を動かして、またまた「何も動かないこと」 を確認してください。
 
 
−まとめ−
 1. switch文は、指定された式によって、いくつも分岐する制御文です。
 2. caseの最後にbreak文を書かないと、次のcaseも実行してしまうので注意しましょう。
 3.defaultは、無理矢理つけなくてもよいのですが、処理をしなくても、付けておいて、
  式の結果がcaseで指定された値から、すべて外れた時の受け皿として置いておくと、
  処理のまとまりとして見やすくなります。

ものづくりBLOG

Blog Category

Blog Calendar

RSS 2.0