くり返し処理中に、強制的に抜け出したいことがあります。そんなときは、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*J
が 12
に等しければ、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
ループの先頭で、「ループを終了する値」と「ステップ量」を決めないと、終了条件が決まらないためです。中から外に飛び出すことはできます)。また、後で出てくる「関数・手続き」の中へ飛び込んだり、逆に中から外へ飛び出したりすることはできません(理由は少し複雑で、関数・手続きから戻る位置や、ローカル変数の情報について、つじつまが合わなくなってしまうためです)。
[ ← トップページへ ]
[ ダウンロードページへ → ]