<C言語入門/車載ソフト> switch文
こんにちは、レオハルです。
車載ソフトで利用するC言語入門シリーズ「switch文」です。
※通常のC言語解説とは、異なり組込み・車載ソフトに特化した記載があります。ご注意ください。
基本的な使い方
今回は、「分岐」の処理に分類されるswitch文についてです。
switch文は、指定した式の値により、処理を変えることができます。
switch文の使い方は、次のようになります。
switch( 式 ){ case( 定数1 ) :
式の値が定数1の場合の処理 break ; case( 定数2 ) :
式の値が定数2の場合の処理
break ; default :
式の値が定数1・2以外の場合の処理
break ;
式の値がcase文で指定した定数と一致した場合に、それぞれの場合の処理が実行されます。case文で指定した定数のいずれとも一致しない場合には、defaultの処理が実行されます。
次に5段階評価に応じてお小遣いを決定する例を挙げます。
/* 5~1の成績に応じてお小遣いを決定する関数 */ u2 u2g_set_money( u1 u1_score ) { u2 u2_tmp_money switch( u1_score ){ case( 5 ) : /* 成績5の人は10000円 */ u2_tmp_money = 10000 ; break ; case( 4 ) : /* 成績4の人は7000円 */ u2_tmp_money = 7000 ; break ; case( 3 ) : /* 成績3の人は5000円 */ u2_tmp_money = 5000 ; break ; case( 2 ) : /* 成績2の人は3000円 */ u2_tmp_money = 3000 ; break ; case( 1 ) : /* 成績1の人は1000円 */ u2_tmp_money = 1000 ; break ; default : /* 例外処理 */ u2_tmp_money = 0 ; break ; }
return( u2_tmp_money ) ; }
このように、式の値が複数の定数に当てはまるかどうかで処理を切り替える場合に、switch文を利用します。
breakについて
前述の例では、各caseの最後に必ずbreakを入れていました。
実は、このbreak文によってswitch文のブロック外に抜けています。
case内の処理が終わっただけで、switch文のブロック外に抜けていくわけではありません。breakがない場合には、続いて次のcase内の処理が実行されます。
下記に先ほどの例を少し変えて、breakの違いを見てみましょう。
/* 5~1の成績に応じてお小遣いを決定する関数 */ u2 u2g_set_money( u1 u1_score ) { u2 u2_tmp_money switch( u1_score ){ case( 5 ) : /* 成績5の人は10000円 */ u2_tmp_money = 10000 ; break ; case( 4 ) : /* 成績4の人は7000円 */ u2_tmp_money = 7000 ; break ; case( 3 ) : /* 成績3の人は5000円 */ u2_tmp_money = 5000 ; break ; case( 2 ) : case( 1 ) : /* 成績2or1の人は1000円 */ u2_tmp_money = 1000 ; break ; default : /* 例外処理 */ u2_tmp_money = 0 ; break ; }
return( u2_tmp_money ) ; }
この例では、u1_scoreが「2」の場合の処理内に、breakがないため、続いて「1」の場合の処理が実行されます。
上記例では、意図的にbreakを書いていないため、問題ありませんが、うっかりbreak文を書き忘れた場合、意図せず、次の処理まで実行してしまうため、注意が必要です。構文としては、間違いではないため、コンパイルエラーにはならないため、見つけにくいバグとなって今うでしょう。
defalutについて
次にdefault文について触れておきます。
if文-elseif文-else文のelse文と同様に、他の条件のどれとも合致しなかった場合に実行される処理になっています。
switch文の場合、式がいずれかのcase文と合致する場合に期待する処理を行う、という使い方を想定しているため、基本的には、取りえない数値がない場合に使われます。
したがって、defaultの処理が実行されることがない構造となるため、例外処理として位置付けることが多いです。
if文との比較・使い分け
if文でも同様のことが実現可能です。利用シーンに応じて使い分けが重要です。
ある1変数がどの値をになっているかを問うようなシーンではswitch文、
条件に応じて、処理を変更させる場合if文、
など、どういう処理なのか、内容を考えて、それに適したほうを採用するとよいでしょう。フローチャートなどで、判定内容を整理してみると判断の助けになるかもしれません。
処理速度が、switch文のほうが早いという意見を聞くことがあります。
たしかに昔のスペックの低いマイコンを選んでいる場合には、影響がでた場合もあると思います。しかし、最近のマイコンであれば、可読性を考えて、読みやすく、移植しやすい記載方法を選ぶほうがよいでしょう。
C言語学習におススメの書籍
【C言語/プログラミング初心者の方】
【入門卒業レベルの方】
【組込み向け】