もうひとつの方式として, いくつかのデータを入力したあと, 終わりのしるしとして特別な値を入力する方法がある. しるしとなる値には, 普通のデータではありえないような値を使う. (データがすべて正数であるなら -1 とか.) この方式でのプログラムの書き方を考えてみよう.
教科書のList 7-1(P.149)のプログラムを見てみよう. 主要な部分は9行目から13行目で, ここに再掲すると, 以下のとおり.
この授業では文字型のデータについて取り上げていないけれど, 簡単に説明すると getchar() は文字データを1文字入力するものである. 上のプログラムをすなおに言葉に直すと, こうなる:c = getchar(); while (c != '.'){ printf("'%c'\n", c); c = getchar(); }
データの終わりのしるしとして, ピリオド文字をつかっているわけだ.c に一文字入力する c がピリオドでない限り c を文字として出力し c に一文字入力する をくりかえす
さて, このプログラムでは 「c に一文字入力する」という同じ処理がループに入る前とループの中の二ヶ所に 書いてあるあたりが変である. このプログラムの本当にやりたいことは,
「文字を入力して, それがピリオドでない限りその文字を出力する」あるいは
「文字を入力して, それを出力する. ただしピリオドが入力されたら それは出力せずに終了」ということなのだが, これをwhile文で書こうとするとうまく行かないのだった.
のように書ければ自然なのだが(同じことを二回書かなくてすむ), 残念ながら while文ではこのような「途中に終了判定のあるループ」 は書けないのだった. なので, しかたなくループをちょっと「ほぐして」, 条件判定を最初に持ってきたのが当初のプログラムなのだった.くりかえし始め c に一文字入力する c がピリオドだったら繰り返しをやめる c を文字として出力 をくりかえす
現実の用途では, こうした「終了のしるしがあるまでなにか処理を繰り返す」 というプログラムは一般的であるから, このようなwhile文の使い方になれておく必要がある.