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文を使う。