ループ動作の仕組み
初期化と条件
前節では、for文で繰り返し(ループ)が実現できることを説明しましたが、
ここでは、そのfor文の
動作の仕組みを、詳しく説明します。
より具体的なfor文の使い方は、次のようになります。
for (初期化; 条件式; 更新) {
繰り返す文;
}
初期化とは、カウント変数の初期化を行うための文です。
ここに書かれた式は、最初に1回だけ実行されます。
条件式とは、ループの終了条件を設定するための文です。
ここに書かれた式の値が真の間は、繰り返す文を実行し続けます。
更新とは、カウント変数の更新を行うための文です。
ここに書かれた式は、繰り返しを行う文を実行した後に実行されます。
これを元にして、前節で作成したプログラムの動作を調べてみます。
#include <stdio.h>
int main(void)
{
int i;
for (i = 1; i <= 10; i++) {
printf("メッセージ\n");
}
return 0;
}
ここでは、初期化の式が i=1 となっています。
この式は最初に1回だけ実行されるので、ループの開始時点でiは1になります。
次に、条件式の比較を行います。
この段階ではiの値は1のままなので i<=10 の結果は真となり、
その結果、まだループは実行を続けることになります。
次に、繰り返す文を実行します。ここでは printf文が実行されます。
次に、更新の式が実行されます。
それまでiの値は1でしたが、 この更新の式はi++となっていますから
iの値が1増加して2になります。
++演算子を忘れてしまった人は、5章1節6項を見て思い出してください。
この、条件式→繰り返す文→更新、という実行を何度も繰り返して、
iが11になった時 i<=10 の
条件が偽となりループから抜け出すことになります。
この様に、カウント変数の値を変化させながら、条件が偽になるまで繰り返すことで、
決まった回数のループ処理を実現させているのです。
for文では、初期化・条件式・更新の部分に、どんな式を置いても構いません。
1回毎に1ずつ減らしたり、あるいは無関係の式でも構いません。
しかし、決まった回数のループの実現には、前節のような式が1番使いやすいです。
いつまでも・・・
for文では、どんな式を置いてもいいどころか、式を置かなくても構いません。
次のプログラムは、式を一切置かないfor文です。
ただし、このプログラムは
実行しないことをオススメします。
#include <stdio.h>
int main(void)
{
for (;;) {
printf("メッセージ\n");
}
return 0;
}
このプログラムの実行結果は、次の通りになります。
メッセージ
メッセージ
メッセージ
メッセージ
メッセージ
・
・
~以降省略~
このプログラムは、無限にメッセージを表示し続けます。
プログラムを強制終了させない限り、終わることはありません。
前項で紹介した9999回の場合、9999回できっちり終わりますが、
上記のプログラムは、本当にいつまでも終わりません。
これは、条件式を省略したので、その部分が常に真であると判定されてしまい、
いつまでたっても繰り返しを実行しているという状態に陥ったためです。
この様に、無限に実行されるループを、
無限ループと呼びます。
【無限ループ】
同じ動作を無限に繰り返すプログラムのこと。
実は、この無限ループは非常に広く使われるテクニックです。
みなさんが普段から使っている、一般的なアプリでは、
キー入力やマウス入力やタッチ入力があったら、それに対応した画面を表示するという処理を、
ユーザーがアプリを終了させるまでは永遠に繰り返しています。
つまり、これまでに作ってきたプログラムと違い、
一般的なアプリは勝手に終わりません。
そのように、ユーザーが明示的にプログラムの終了を選ばない限り、
プログラムを終わらせないようにしたいときには、無限ループが使われています。
強制脱出
ユーザーが明示的にプログラムの終了を選ばない限り、プログラムを終わらせないようにしたいときには、無限ループを使うことは説明しました。
しかし、さきほどのプログラムでは、ユーザーの入力に応じて、プログラムを終了するための手段が用意されていませんでした。
ユーザーの入力値が、特定の値だった場合に、for文を終わらせてしまうようにすれば、ユーザーの入力によって終わるようにできます。
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回表示するまでは終わらないはずなのですが、 3回表示した時点で終了しています。
これは、3回目にiの値が3になり、if文の次のbreak文が実行されたためです。
break文はfor文の条件と同時に使用することができるので、
ユーザーの入力によって終わらせるため、繰り返し途中にエラーが発生した、など、
繰り返し回数が完了する以前に終了させるために使用できます。