全節では、for文で繰り返し(ループ)が実現出来ることを説明しましたが、
ここでは、そのfor文の動作の仕組みを、詳しく説明します。
より具体的なfor文の使い方は、次のようになります。
初期化とは、カウント変数の初期化を行うための文です。for (初期化;条件式;更新) { 繰り返す文; }
条件式とは、ループの終了条件を設定するための文です。
ここに書かれた式の値が真の間は、繰り返す文を実行し続けます。
更新とは、カウント変数の更新を行うための文です。
ここに書かれた式は、条件式を比較した後に毎回実行されます。
これを元にして、前節で作成したプログラムの動作を調べてみます。
ここでは、初期化の式が i=1 となっています。#include <stdio.h> int main(void) { int i; for (i = 1;i <= 10;i++) { printf("メッセージ\n"); } return 0; }
次に、printf文を実行した後で、条件式の比較を行います。
この段階ではiの値は1のままなのでi<=10の結果は真となり、
その結果、まだループは実行を続けることになります。
次に、更新の式が実行されます。それまでiの値は1でしたが、
この更新の式はi++となっていますからiの値が1増加して2になります。
++演算子を忘れてしまった人は、5章1節6項を見て思い出して下さい。
この次は、再びprintf文が実行されます。
この、繰り返す文→条件式→更新、という実行を何度も繰り返して、
iが11になった時 i<=10 の条件が偽となりループから抜け出すことになります。
この様に、カウント変数の値を変化させながら、条件が偽になるまで繰り返すことで、
決まった回数のループ処理を実現させているのです。
for文では、初期化・条件式・更新の部分に、どんな式を置いても構いません。
1回毎に1ずつ減らしたり、あるいは無関係の式でも構いません。
しかし、決まった回数のループの実現には、前節のような式が1番使いやすいです。
for文では、どんな式を置いてもいいどころか、式を置かなくても構いません。
次のプログラムは、式を一切置かないfor文です。
ただし、このプログラムは実行しないことをお勧めします。
このプログラムの実行結果は、次の通りになります。#include <stdio.h> int main(void) { for (;;) { printf("メッセージ\n"); } return 0; }
このプログラムは、無限にメッセージを表示し続けます。
メッセージ
メッセージ
メッセージ
メッセージ
メッセージ
・
・
・
これは、条件式を省略したので、その部分が常に真であると判定されてしまい、
いつまでたっても繰り返しを実行しているという状態に陥ったためです。
この様に、無限に実行されるループを、無限ループと呼びます。
実は、この無限ループは非常に広く使われるテクニックです。
[ 無限ループ ]
同じ動作を無限に繰り返すプログラムのこと。
広い意味では、アプリケーションは全て無限ループで構成されている。
for文は条件式が偽になった時に終了するようにするのが普通ですが、
実は、途中で勝手にfor文を終わらせてしまうことも出来ます。
それには、break文を使用します。
for文の中でbreak文が実行されると、for文は強制的に終了され、
カウント変数はその時点の値のままとなります。
次のプログラムは、break文でループを終了させる例です。
このプログラムの実行結果は、次の通りになります。#include <stdio.h> int main(void) { int i; for (i = 1;i <= 10;i++) { printf("%d\n",i); if (i == 3) break; /* ループを終了する */ } return 0; }
条件式を見ると10回表示するまでは終わらないはずなのですが、
1
2
3
break文はfor文の条件と同時に使用することが出来るので、
繰り返し途中にエラーが発生した場合などに終了させるために使用します。