● ステートメントリファレンス
for 〜 next
for ループを構成します。
for 制御用変数の初期値設定 to 終了値
処理ブロック
next
「制御用変数の初期値設定」には、ループを制御するための変数と初期値の設定を記述します。これには代入式を使用します。
終了値には、ループが終了する値を計算式で記述します。制御用変数 > 終了値となった時点で、対応する next の次の行に処理を移します。
for i = 0 to 10
処理ブロック
next
この場合、ループを繰り返す毎に i が 0 、1 、2 、… と変化し、10 を超えた時、next の次の行へ移ります。
next は単独で記述します。通常の BASIC のような、制御変数を書く書式ではありませんので、注意してください。 |
goto や if 〜 then でもループを構成する事はできますが、for 〜 next ではラベルを使用しないループを構成する事ができます。また、ラベルによるループよりも for 〜 next の方が若干高速です。
増分値
制御用変数の増分はデフォルトで 1 になっていますが、step を使用する事で変更する事ができます。
for 制御用変数の初期値設定 to 終了値 step 増分
処理ブロック
next
増分は計算式で記述します。ここで設定した値が、1ループ毎に制御用変数へ加算されます。
次のように、制御用変数を直接変化させる事もできます。この場合、for に変数の計算を行わせないようにするため、step には 0 を指定します。
for i = 1 to 100 step 0
処理ブロック
i = i * 2
next
step が 0 なので、制御用変数 < 終了値を終了条件にしたい場合は、この方法を使用する事ができません。
その場合は、制御変数の計算に for が行う減算を打ち消すための加算を入れます。
値は 0 以外で任意。
終了条件を反転させるため、負の値を指定する事
↓
for i = 64 to 1 step -値
処理ブロック
i = i / 2 + 値
next ↑
step に指定した値の正の値を加算する
|
初期化、比較、加減算のタイミング
- 変数の初期化は、for が実行された時に行われます。next や continue で戻った時には行われません。
- 比較は、for が実行された時は初期化の後で実行されます。また、next や continue で戻った時は加減算の後で行われます。
- 加減算は、for が実行された時は行われません。next や continue で戻る時に、最初に(比較の前に)実行されます。
次の2つの処理は等価です。
ループ1.
for i = 0 to 10 step 2
処理ブロック
next
ループ2.
i = 0 : # i の初期化
$loop_jmp
if i <= 10 then $loop_end : # 終了条件
処理ブロック
i = i + 2 : # step 2
goto $loop_jmp : # next
$loop_end
for ループのネスト
for 〜 next は、アプリケーションが決定した限界数まで、入れ子にする事ができます。
for i = 0 to 10
for j = 0 to 10
for k = 0 to 10
処理ブロック
next
next
next
記述上の注意点
- for と next は個数として、対で記述されていなければなりません。
例1.for の個数に対して next が足りないのでエラーになる
if 条件 then
for i = 0 to 10
else
for i = 10 to 0 step -1
endif
処理ブロック
next
この場合は、次のようにする事ができます。
if 条件 then
i = 0 : for_end = 10 : for_step = 1
else
i = 10 : for_end = 0 : for_step = -1
endif
for i = i to for_end step for_step
処理ブロック
next
上記のような場合は、記述方法に拘りが無いのであれば、次のようにループを分けた方が見易くなります。
if 条件 then
for i = 0 to 10
gosub $処理ブロック
next
else
for i = 10 to 0 step -1
gosub $処理ブロック
next
endif
|
- 変数初期化のための代入式、終了値、増分値の式は、for が実行された時にのみ計算されます。ループ中に内容が変化する式を記述しても、for 実行時しか評価されませんので、注意してください。
for i = 0 to cnt - 1
for が実行された時のみ計算される
- next に処理が通る時は、先に for が実行されていなければなりません。
対応する for が一度も実行されていない状態で next が実行されるとエラーになります。
例2.
i = 0
if 条件 then for i = 0 to 9
処理
next
この場合、条件が真の時はループを実行できますが、偽の時は for を通らないためエラーになります。
例3.
goto $jump
for i = 0 to 10
$jump
処理ブロック
next ← エラー
ループの前に一度だけブロックを実行したい場合は、ループの回数を調整するか、サブルーチンを使用する事ができます。
gosub $subroutine
for i = 0 to 10
gosub $subroutine
next
end
$subroutine
処理ブロック
return
for ループの中に飛び込むジャンプには制約がありますが、ループから抜け出すジャンプには、比較的自由があります。次のように、for ループの入れ子を一気に抜け出す事もできます。
for i = 0 to 10
for j = 0 to 10
for k = 0 to 10
if ループの終了条件 then $全てのループから抜ける
next
next
next
$全てのループから抜ける
・
・
・
|