ログイン
kid's world

文を繰り返し実行する

前回解説したif文とswitch文は実行の「流れを変える」ことはできるが,「流れをさかのぼる」ことはできない。今回は流れをさかのぼり,繰り返し処理を実現する制御文について解説する。


はじめに

前回は,条件判断を行うプログラムを作成するためには何が必要かについて解説した。重要なのは,if文やswitch文などの制御文,そして関係演算子や論理演算子などの条件を計算する演算子である。

if文は,与えられる値が真か偽かによって実行する文を切り替える制御文だ。その値を関係演算子や論理演算子を使って計算すれば,プログラマが指定した条件に合致しているかどうかによって,実行する文を切り替えられる。もっとも利用される制御文はこのif文である。

switch文も,与えられた値によって実行する文を切り替える制御文だが,if文のように「2つのうちどちらかを実行する」のではなく,指定した値に一致するかどうかによって「多くの文の中から実際に実行する文を選択する」ことができる。基本的にはif文をいくつも使えば同じことができるが,switch文を使ったほうがスマートになる場合は,迷わず使ったほうがよい。

今回のお話

そして今回は,残りの制御文,while文とdo while文,for文について解説する。これらの制御文は,if文やswitch文のように「実行の流れを一時的に分岐させる」のではなく「ある条件のもとに何度も同じ文を実行する」ことができる制御文である。つまり,繰り返し処理ができるようになるわけだ。このことによって,プログラムの幅を広げることができるのだ。

文を繰り返し実行するwhile文

同じ処理を繰り返し行わなければならない場合,while文を使うと便利である。while文は,式が真である間,文を繰り返し実行する制御文である。もし最初から式が偽であった場合は,文は一度も実行されることはない。while文はFig. 1のような構造になっている。

Fig. 1: while文の構文

while (式)
  文

「式」と書かれた部分が0以外の値である間,文は繰り返し実行される。それでは,その動作を確かめてみよう。

無限ループ

List 1では,while文の式の部分に1を書いている。すなわち,いつまでも式は1なのだから,while文はいつまでも文を実行し続けることになる。

List 1: 無限ループ

#include <stdio.h>

main()
{
  while(1)
    printf("卵は鶏から生まれ、鶏は卵から育ち、");
}

実際にこれを実行してみると,コンピュータはいつまでも「卵は鶏から生まれ,鶏は卵から育ち,卵は鶏から生まれ,鶏は卵から育ち……」と表示し続ける。このプログラムは止まらないので,見飽きたら強制的に止めるしかない。MS-DOSやUNIXを使っている場合は,Ctrl+Cキーを押して,強制的にこのプログラムを止めよう。なお,このようないつまでたっても終わらない繰り返しを無限ループと呼んでいる。

ブロックを使う

前回に解説したif文では,ブロックを使って複数の文を1つの文として実行したが,もちろんwhile文にもブロックを使うことができる。たとえば,List 2のように使うことができる。このプログラムは,ひたすら「羊が1匹,羊が2匹,……」と数え続けるプログラムだ。ブロックの中で変数iを1つ増やすことによって,数を数えられるようにしている。これも無限ループなので,数え飽きたら強制的に終了しよう。

List 2: 羊が1匹、羊が2匹、…

#include <stdio.h>

main()
{
  int i=0;
  
  while(1) {
    i++;
    printf("羊が%d匹、",i);
  }
}

while文とブロックを組み合わせて書くとき,始まりのカッコ「{」をどこに書くかは,人それぞれなのだが,一般的にはList 2のように,while文の右側に書くことが多い。なぜならwhileの次の行に書くと,行が間延びしすぎて見にくくなるからだ。ただ,これは好みによるので,自分が見やすいと思った方法で書いても大丈夫だ。

条件を指定する

さて,そろそろ無限ループは卒業しよう。List 2を改造して,羊を100匹まで数えるようにする(List 3)。

List 3: 羊が101匹

#include <stdio.h>

main()
{
  int i=0;
  
  while(i<=100) {
    i++;
    printf("羊が%d匹、",i);
  }
  printf("…ぐーぐー。\n");
}

もう一度確認すると,while文は式が0以外である間(すなわち条件が真である間),文を繰り返し実行するのである。つまり,式には「羊が100以下」という条件を書いておけばいいのだ。羊の数はint型変数iでわかるから,

i<=100

とする。ところが,これでは少し問題がある。これを実行すると「101匹」まで数えてしまうことになる。List 3を実際に実行して確かめてみていただきたい。

なぜこのような結果となるのか,List 3を詳しく解析して,while文の動作を理解してみよう。while文は,以下の順序で実行される。

  1. 式を評価する
  2. 式が真(0以外)の場合,文を実行して「1.」へ
  3. 式が偽(0)の場合,文を実行せずに次へ

最初は変数iには0が入っているので,while文の式は真となる。したがって,文が実行される。List 3では文はブロックになっているので,複数の文が実行される。ブロックの中では変数iの内容が1つ増やされ「1」となって「羊が1匹,」と表示される。次に,再びwhile文の式が評価される。今度は変数iは1であるが,式はやはり真となるので前回と同じようにブロック内の文が実行される。

これが何度も繰り返され,iが100まで増えたとしよう。ここからが問題だ。ここでもwhile文の式は変数iが100なので真となり,ブロック内の文が実行される。ブロック内ではiの内容が増やされ,変数iの内容は101となり「羊が101匹,」と表示されてしまう。

100匹まで数えて止める方法はいろいろあるが,いちばん簡単なのは,式を,

i<100

とすることだ。ブロック内の文は,変数iの内容が100のときに実行されてしまうと困る。したがって,List 4のようにするのだ(Fig. 2)。こうすれば,ブロック内の文は変数iが100のときは実行されないということが保証される。

List 4: 羊が100匹

#include <stdio.h>

main()
{
  int i=0;
  
  while(i<100) {
    i++;
    printf("羊が%d匹、",i);
  }
  printf("…ぐーぐー。\n");
}

Fig. 2: List 4の実行結果

/c/repeat-fig2.png

条件が合わないとき

while文は,最初から条件が合わなかったらどういう動きを見せるのだろうか。ではそれをさっそく実験してみよう。List 5は,List 4を少し書き換えて,初期値を100にしたものだ。すると「i<100」は偽となる。このプログラムを実行すると,画面にはどんな文字が出てくるだろうか。

List 5: 最初から条件の合わないwhile文

#include <stdio.h>

main()
{
  int i=100;
  
  while(i<100) {
    i++;
    printf("羊が%d匹、",i);
  }
  printf("…ぐーぐー。\n");
}

「…グーグー。」と出て,プログラムは終了する。この結果から,while文は最初から条件が合わなかったときは「一度も文を実行しないで次の文へ制御を移す」ことがわかる。つまりwhile文では,文は式が真のときのみ実行され,偽のときは絶対に実行されないわけである。


一度は必ず実行」へ進む

広告


©Toshio Koide 1996-2007.

目次

リンクについて

リンクは御自由にどうぞ。

メール

mail.gif

広告