ものづくりBLOG blog page

第5章 何もしない(4):制御文−while文

2011-01-01 (Sat) 05:00
H8+C言語入門:第5章 何もしない(4):制御文−while文
 
 第5章でも、懲りずに何もしないプログラムを作成します。
 これまでは、上から下へ向かって処理をする、単純なものでした。
 ここから”条件”によって処理を繰り返したり、止めたり・・とする処理を制御していく
 ことをやっていきます。
 
 その手始めに、while文です。while文は、条件が成り立つ間、文で指定される処理を繰り
 返します。基本的な構文は次の通りです。
  while(式) 文
 これが基本形です。簡単でしょ。でも、これから使い方をお伝えしますが、結構、いろい
 ろな使い方ができます。
 
<サンプル5-1>
void main(void)
{ /* main関数の始まり */
int i=0; //変数iの宣言と変数iの初期化:0をセットする。
while( i < 10 ) i++; //iを10回インクリメントする。
} /* main関数の終わり */
 
 サンプル5-1のうち、while文のところを見ましょう。
  while( i <10 ) i++;
 基本形から見ると、次の様にそれぞれの構成要素となります。
  式は、括弧()の中なので、「i <10」です。
  文は、;迄の式ですから、「i++;」です。
 では、while文の動きを追跡します。
 
 1)まず、()の中の式を評価します。式は「i < 10」つまり「iが10未満」が条件です。
 2)最初は、iに0が入っている(0で初期化されている)のでこの条件は満たされています。
  つまり「真」です。
 3)「真」なので、文「i++;」が実行されます。
  つまり、iの数は、1つ増えます(インクリメント)。
 4)次に1)に戻って、式「i < 10」を評価し、条件に合わない、つまり「偽」になる迄くり
  返します。 「偽」になるのは、iが10になる時です。
  そこで、iの値が10になったら条件に合わなくなるのでくり返しをやめます。
  つまり、「i++;」を10回実行したことになります。
 
 では、iの値が既に10だったらどんな動き方をするでしょうか。
 
<サンプル5-2>
void main(void)
{ /* main関数の始まり */
int i=10; //変数iの宣言と変数iの初期化:10をセットする。
while( i < 10 ) i++; //iを10回インクリメントする。
} /* main関数の終わり */
 
 while文のところは、サンプル5-1と同じで、iを10回インクリメントする処理です。
 しかし、iの初期値が10なので、while文の最初の式の評価の際、「偽」となる。つまり、
 文を実行できない−ということになります。while文の処理の様子を簡単に表すと次の様
 になります。
 
  while(式) 文
   1)式を評価し、偽だったら終わる。
   2)文を実行する。
   3)1)へ戻る。
 
 while文では、式の評価が先になります。
 式の評価を後にするものは−実はあります。それは、do〜while文です。
 その構文は、次の通りです。
 
  do 文 while(式);
 
 その動き方の違いを見てみます。サンプル5-2をdo〜while文で置き換えてみます。
 
<サンプル5-3>
void main(void)
{ /* main関数の始まり */
int i=10; //変数iの宣言と変数iの初期化:10をセットする。
do {
i++;
} while( i < 10 ); //iを10回インクリメントする。
} /* main関数の終わり */
 
 サンプル5-2では、先に式が評価されるので、文を実行することがありませんでした。
 つまり、iの値は、初期値のままです。
 このサンプル5-3では、変数iの初期値が10ですが、doの最初の文を実行し、インクリメ
 ントされますので、この時点でiの値は、11となっています。次にwhileの式の評価となり
 ます。「i < 10」の評価では、偽となりますので、doへ戻りません。この時の、iの値は、
 11です。
 while文とdo〜while文の違いが分かりましたか?
 使い分けるポイントは、式の評価タイミングです。文の実行前に評価するか、実行後に評
 価するかというところです。いろいろな処理を考える際、いずれかの選択をすることがで
 てくると思います。それぞれの特長をここできちんと理解してくださいね。
 
 ちょっとここで特殊な使い方のご紹介です。
 それは、次の様なものです。
  while(1) 文
  do 文 while(1);
 ()の中に1があります。つまり、常に「真」ですから、文を実行し続けるということにな
 ります。これを無限ループといいます。
 !1の代わりに0とすると・・どうなりますか?少し考えてみてみましょう。
  こんがらないように。
 
 無限ループとなると、無限ですから文を実行し続けるということになります。
 無限ループから抜け出せないのか?ということになりますが、この時の為に、break文と
 いうものが用意されています。
 次の二つのサンプルプログラムは、いずれも1回だけ、文「i++;」を実行して、break文
 のところで、無限ループから抜け出します。while文では、whileの式(1)を評価してから、
 i++を実行し、break文を実行します。do〜while文では、i++を実行してから、break文を
 実行するので、whileの式(1)は評価されません。
 
<サンプル5-4>
void main(void)
{ /* main関数の始まり */
int i=10; //変数iの宣言と変数iの初期化:10をセットする。
while( 1 ){ //無限ループの指定
i++; //iをインクリメントする。
break; //無限ループから抜ける
}
} /* main関数の終わり */
 
<サンプル5-5>
void main(void)
{ /* main関数の始まり */
int i=10; //変数iの宣言と変数iの初期化:10をセットする。
do {
i++; //iをインクリメントする。
break; //無限ループから抜ける
} while( 1 ); //無限ループの指定
} /* main関数の終わり */
 
 break文は、何も無限ループだけの為のものではありません。普通のwhile文やdo〜while
 文の中でも使います。
 
 では、実際にH8を動かして、またまた「何も動かないこと」 を確認してください。
 でも、やはり飽きてきましたか?
 
 
−まとめ−
 1. while文は、条件が成り立つ間、文を繰り返す制御文である。
 2. while文は、条件が成り立たない場合は、文を実行しない。
 3. 文を実行した後に条件を評価したい時は、do〜while文を使う。
 4. 式に「1」を指定すると無限ループになる。
 5. while文、do〜while文から抜け出すにはbreak文を使う。

ものづくりBLOG

Blog Category

Blog Calendar

RSS 2.0