苦しんで覚えるC言語

ループ動作の仕組み


第1項:初期化と条件

前節では、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番使いやすいです。

目次に戻る

第2項:いつまでも・・・

for文では、どんな式を置いてもいいどころか、式を置かなくても構いません。
次のプログラムは、式を一切置かないfor文です。
ただし、このプログラムは実行しないことをお勧めします。

#include <stdio.h>

int main(void)
{
	for (;;) {
		printf("メッセージ\n");
	}
	return 0;
}
このプログラムの実行結果は、次の通りになります。

メッセージ
メッセージ
メッセージ
メッセージ
メッセージ
  ・
  ・
  ・
このプログラムは、無限にメッセージを表示し続けます。
プログラムを強制終了させない限り、終わることはありません。

これは、条件式を省略したので、その部分が常に真であると判定されてしまい、
いつまでたっても繰り返しを実行しているという状態に陥ったためです。
この様に、無限に実行されるループを、無限ループと呼びます。
無限ループ
同じ動作を無限に繰り返すプログラムのこと。
広い意味では、アプリケーションは全て無限ループで構成されている。
実は、この無限ループは非常に広く使われるテクニックです。
考えてみればわかります。例えば、メモ帳などのアプリケーションでは、
キーの入力があったら、それを表示するという処理を、
ユーザーが×ボタンを押して終了させるまでは永遠に繰り返しています。

目次に戻る

第3項:強制脱出

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;
}
このプログラムの実行結果は、次の通りになります。

1
2
3
条件式を見ると10回表示するまでは終わらないはずなのですが、
3回表示した時点で終了してしまっています。
これは、3回目にiの値が3になり、if文の次のbreak文が実行されたためです。

break文はfor文の条件と同時に使用することが出来るので、
繰り返し途中にエラーが発生した場合などに終了させるために使用します。

目次に戻る