Daruma BASIC 入門 (7)
くり返しから抜け出す

くり返し処理中に、強制的に抜け出したいことがあります。そんなときは、BREAK 文を使います。くり返し処理をその時点で終了して、くり返し部分の続きを実行します。

前回書いた、「1を押したら "ONE" と表示」「2を押したら "TWO" と表示」「0を押したら終了」「それ以外なら最初からくり返す」という処理を、BREAK 文を使って書いてみます。

   1 DO
   2 C=INKEY()
   3 IF C=49 THEN
   4 PRINT "ONE"
   5 ELSEIF C=50 THEN
   6 PRINT "TWO"
   7 ELSEIF C=48 THEN
   8 BREAK
   9 ENDIF
  10 LOOP
    

7〜8行目の ELSEIF C=48 THEN / BREAK が今回のテーマです。「0を押したらループから抜け出す」という意味になります。上のプログラムでは、くり返しの DO..LOOP に終了条件がついていませんから、BREAK がなければ無限ループになってしまいます。

BREAK 文と同様にくり返しの途中で処理の流れを変える文として、CONTINUE 文があります。CONTINUE 文は、くり返しの残りの部分を飛ばして、次のくり返しを始めます。「次のくり返しを始める」とは、FOR ループの場合は NEXT 文の位置にジャンプすること、DO ループの場合は LOOP の位置にジャンプすることと同等です。例えば、次のプログラムでは、I=3 の時だけ3行が飛ばされて、NEXT の位置に直接移動します。

   1 FOR I=1 TO 5
   2 IF I=3 THEN CONTINUE
   3 PRINT I
   4 NEXT
   5 PRINT "END"
    

くり返しが二重になっている時に BREAK 文や CONTINUE 文を使うと、一番内側のくり返しについて処理が行われます。次のプログラムを走らせてみましょう。

   1 FOR I=1 TO 5
   2 FOR J=1 TO 5
   3 IF I*J=12 THEN PRINT I,J:BREAK
   4 NEXT
   5 NEXT
   6 PRINT "END"
    

3行目を見てください。I*J12 に等しければ、I,J を表示して、くり返しを終了します。最初にこの条件に合うのは、I=3,J=4 のときです。しかし、このとき終了するくり返しは、内側の2〜4行のくり返しだけなので、外側の1〜5行のくり返しはまだ生きています。従って、実行はまだ続いて、I=4,J=3 のときにもう一度 I,J が表示されます。実行結果は次のようになります。

3   4
4   3
END

二重のくり返しから一気に抜け出すには、GOTO 文を使います。GOTO は、指定したラベルの場所に飛ぶための命令です。ラベルは、@ に英数字を続けたものです。

   1 FOR I=1 TO 5
   2 FOR J=1 TO 5
   3 IF I*J=12 THEN PRINT I,J:GOTO @EXIT
   4 NEXT
   5 NEXT
   6 @EXIT
   7 PRINT "END"

この場合、I=3,J=4 の時に GOTO @EXIT が実行されます。ラベル @EXIT は6行目にあり、これは2つの FOR ループの外なので、二重ループから一気に抜け出したことになります。実行結果は次の通りです。

3   4
END

GOTO 文は、自由にプログラムの流れを変えられるので、一見便利に見えます。しかし、GOTO 文を使って実行位置があちこちに移動するプログラムは、書いた人の意図がわかりにくいため、不具合が起きた時に修正するのが難しくなります。このため、なるべく IF...ELSEIF...ELSE 文、FOR 文、DO..LOOP 文の組み合わせでプログラムを書く習慣をつけておき、GOTO 文は「最後の手段」にとっておくことをお勧めします。

なお、GOTO 文には、いくつか制約があります。まず、FOR ループの外から中へ飛び込むことはできません(FOR ループの先頭で、「ループを終了する値」と「ステップ量」を決めないと、終了条件が決まらないためです。中から外に飛び出すことはできます)。また、後で出てくる「関数・手続き」の中へ飛び込んだり、逆に中から外へ飛び出したりすることはできません(理由は少し複雑で、関数・手続きから戻る位置や、ローカル変数の情報について、つじつまが合わなくなってしまうためです)。

[ ← トップページへ ]

[ ダウンロードページへ → ]