回数が決まっている繰り返し

ループ動作の仕組み

MMGames

無限ループ



初期化と条件


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

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

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

つまり、これまでに作ってきたプログラムと違い、メモ帳のプログラムは勝手に終わることがありません
そのように、ユーザーが明示的にプログラムの終了を選ばない限り、プログラムを終わらせないようにしたいときには、無限ループが使われます。

強制脱出


ユーザーが明示的にプログラムの終了を選ばない限り、プログラムを終わらせないようにしたいときには、無限ループを使うことは説明しました。
しかし、先程のプログラムでは、ユーザーの入力に応じて、プログラムを終了するための手段が用意されていませんでした。
ユーザーの入力値が、特定の値だった場合に、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;
}
このプログラムの実行結果は、次の通りになります。

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

break文はfor文の条件と同時に使用することが出来るので、
ユーザーの入力によって終わらせるため、繰り返し途中にエラーが発生した、など、繰り返し回数が完了する以前に終了させるために使用します。

サイト目次


第0部:プログラム概要編

  1. プログラムとは何か?

2章:プログラムの書き方

  1. 書き方のルール
  2. 書き方の慣習
  3. 練習問題2

3章:画面への表示

  1. 文字列の表示
  2. 改行文字
  3. 練習問題3

6章:キーボードからの入力

  1. 入力用の関数
  2. 入力の恐怖
  3. 練習問題6

9章:回数が決まっている繰り返し

  1. 繰り返しを行う文
  2. ループ動作の仕組み
  3. 練習問題9

10章:回数がわからない繰り返し

  1. 回数不明ループ
  2. 入力チェック
  3. 練習問題10

13章:複数の変数を一括して扱う

  1. 複数の変数をまとめて扱う
  2. 配列の使い方
  3. 練習問題13

20章:複数のソースファイル

  1. 最小限の分割
  2. 分割の定石
  3. 練習問題20