C言語で繰り返し処理を行う場合は、指定した一定の回数を繰り返すfor文と、繰り返し回数が決まっていない不定回数を繰り返すwhile文及びdo〜while文があります。
このような繰り返し処理の途中でループから抜け出したいとき、break文を使います。
break文はその名前のとおり、ループ制御構造を壊すための文と言えます。

基本的なbreak文の記述方法

break文は以下のように記述します。

	break;

break文は上記のように単独で使われることはほとんどありません。
一般的に、if文と組み合わせて以下のように使います。

	繰り返し処理 {
		if (x == 0) break;
	}

break文を使ってループから抜け出す方法

for文やwhile文、do〜while文のループから抜け出すときは、if文を使ってループを抜け出す条件を記述します。
以下のプログラム1は、for文を使い、文字配列mojiに格納された文字数分をループします。

/* ※プログラム1 */
#include <stdio.h>
#include <string.h>
int main(){
	int i;
	char moji[]="Windows";
	for (i = 0; i < strlen(moji); i++) {
	}
	printf("moji[]=%s  i=%d\n",moji, i);
}

※プログラム1の実行結果

moji[]=Windows  i=7

もしプログラム1において、文字列mojiの中に”d”という文字があった場合はループを抜け出したいとしたら、以下のプログラム2のようにif文とbreak文を追記します。

/* ※プログラム1 */
#include <stdio.h>
#include <string.h>
int main(){
	int i;
	char moji[]="Windows";
	for (i = 0; i < strlen(moji); i++) {
		if (moji[i] == 'd') break;        /* 追加 */
	}
	printf("moji[]=%s  i=%d\n",moji, i);
}

※プログラム2の実行結果

moji[]=Windows i=3

break文を実行しますと、ループの直後に制御が移動します。
プログラム1とプログラム2の実行結果のうち、変数iの値に注目しますと、break文の実行によって変数iの値が変化していることが分かると思います。

break文を使って抜けることができるループはひとつだけ

break文を使うときに気を付けたいのは、break文で抜け出せるループは1つだけ、ということです。
例えば繰り返し処理が二重になっているなら、それぞれの繰り返し処理にbreak文を使う必要があります。
以下のプログラム3は、三重の繰り返し処理からbreak文を使ってループを抜け出しています。

/* プログラム3 */
#include <stdio.h>
#include <string.h>
int main(){
	int i,j,k;
	char moji[]="Windows";
	for (i = 0; i < strlen(moji); i++) {
		if (moji[i] == 'd') break;
		for (j = 0; j < strlen(moji); j++) {
			if (moji[j] == 'o') break;
			for (k = 0; k < strlen(moji); k++) {
				if (moji[k] == 'w') break;
			}
			printf("i=%d  j=%d  k=%d\n", i,j,k);
		}
		printf("i=%d  j=%d  k=%d\n", i,j,k);
	}
	printf("i=%d  j=%d  k=%d\n", i,j,k);
}

※プログラム3の実行結果

i=0  j=0  k=5
i=0  j=1  k=5
i=0  j=2  k=5
i=0  j=3  k=5
i=0  j=4  k=5
i=1  j=0  k=5
i=1  j=1  k=5
i=1  j=2  k=5
i=1  j=3  k=5
i=1  j=4  k=5
i=2  j=0  k=5
i=2  j=1  k=5
i=2  j=2  k=5
i=2  j=3  k=5
i=2  j=4  k=5
i=3  j=4  k=5

もしbreak文の動きがよく理解できないようでしたら、少し面倒かもしれませんが、プログラム3と、プログラム3の実行結果をワンステップずつ付き合わせて見ていきますと、break文の挙動が分かると思います。

多重ループを一気に抜けだす裏技

上記のプログラム3のように多重ループから抜け出すには、繰り返し処理ごとにbreak文を呼び出すのが一般的です。
とは言え、多重ループの構造が複雑な場合、ループから抜け出すことが大変な場合があります。
そのようなとき、繰り返し処理から一気に抜け出す方法としてgoto文があります。
以下のプログラム4は、goto文を使い、三重ループの内側から一気に繰り返し処理を抜け出しています。

/* プログラム4  - goto文の使用例*/
#include <stdio.h>
#include <string.h>
int main(){
	int i,j,k;
	char moji[]="Windows";
	for (i = 0; i < strlen(moji); i++) {
		if (moji[i] == 'd') break;
		for (j = 0; j < strlen(moji); j++) {
			if (moji[j] == 'o') break;
			for (k = 0; k < strlen(moji); k++) {
				if (moji[k] == 'w') goto END;    /* 修正 */
			}
			printf("i=%d  j=%d  k=%d\n", i,j,k);
		}
		printf("i=%d  j=%d  k=%d\n", i,j,k);
	}
END:    /* 追加 */
	printf("i=%d  j=%d  k=%d\n", i,j,k);
}

※プログラム4の実行結果

i=0 j=0 k=5

一見するとgoto文は非常に便利なように感じるかも知れません。
ですがプログラム4のように小規模なプログラムならいざ知らず、大規模なプログラムになりますと、goto文の飛び先がどこにあるのか分かりにくくなってしまい、プログラムの「読みやすさ」が著しく低下してしまいます。
したがってC言語では、goto文は使用しないことが一般的に推奨されていますし、goto文を嫌うプログラマーも多いです。
そのため、「goto文を使用した方が明らかにプログラムが読みやすくなる」と言い切れる場合を除き、goto文は裏技として覚えておく程度にしておく方がよいでしょう。

C言語超入門の第24回まとめ

今回のC言語超入門では、break文を使って、for文や、while文、do〜while文といった繰り返し処理の途中でループを抜け出す方法についてお伝えしました。
break文のポイントをまとめますと、
– break文を実行すると、ループ処理の直後に制御が移動する
– 多重ループから抜けるには、ループ処理ごとにbreak文が必要
– goto文を使ってループから抜けることは非推奨
です。
ステップ・バイ・ステップ。焦らず一歩ずつ進んでいきましょう。