6−8.ループの常套手段

よく使われるループ処理


(1)無限ループ

永遠に続くループ処理。ただし、ある条件で break文で脱出するように作ります。

(使用方法)
(例)
int n;
int sum = 0;

while (1) {	…無限ループ

	scanf("%d", &n);
	if (n == -1)	…入力データが -1 なら
		break;	ループから脱出
		
	sum = sum + n;
}
printf("sum = %d\n", sum);
  • while文の無限ループは
    while (1) {
    
    	...
    }
    
    で記述。
  • for文の無限ループは
    for (;;) {
    
    	...
    }
    
    で記述。
  • 何故 while(1) が無限ループになるのか?
    1. C言語では =0:「偽」、≠0:「真」 である
    2. 「1」は「≠0」、つまり「真」
    3. while(1) は「常に真」、つまり「無限ループ」
(フローチャート)
演習

(2)「Ctrl+Z」が入力されるまで、入力処理を続ける

これまでの説明では、特定のデータの入力でループを終了させるようにしてきましたが、どのデータも意味があり、特定のデータが決められない場合があります。そのような場合に、キーボードから「Ctrl+Z」を入力することによりループを終了させることができます。

(例)
int n;
int sum = 0;

while (scanf("%d", &n) != EOF) {	…「Ctrl+Z が入力されるまで」という意味

	sum = sum + n;
}
printf("sum = %d\n", sum);
(注) 「EOF」 は、End Of File という意味でファイルの終了を表します。
stdio.h の中で一般に

	#define	EOF	-1
	
とマクロ定義され、値は -1 です。

scanf() は、MS-DOS と Windows の環境では「Ctrl+Z」の入力で EOF を返却しますが、
UNIXの環境では「Ctrl+D」の入力で EOF を返却します。

また、VC++ や BCB などの Windows の C では、
「Ctrl+Z」は「Undo」のショートカットキーになっているためか、
その後の printf() などの出力を打ち消してしまうようです。(2001.6.24 追記)
どうやらこの現象はWindows9xとMeのDOS窓のバグ(仕様?)のようです。
WindowsXPやNTでは発生しません。(2002.6.11追記)
演習
◆◆前ページ  ▲TOP▲  次ページ◆◆

banner
「初心者のためのポイント学習C言語」
Copyright(c) 2000-2004 TOMOJI All Rights Reserved