繰り返しのための、流れ制御命令文
構文:
For iterator [ as datatype ] = startvalue To endvalue [ Step stepvalue ]
[ statement block ]
Next [ iterator ]
パラメタ:
iterator(反復子)
繰り返しの、開始値と終値を指定するために使う、変数名
datatype
指定すると、変数 iterator は、datatype 型で、自動的に宣言されます。
startvalue
iterator(反復子) の開始の値を指示する式
endvalue
iterator(反復子) の値と比較するために用いられる式
stepvalue
繰り返しのたびに、iterator(反復子) に加算される式
記述:
For...Next は、まず iterator(反復子) を、startvalue で初期化します。次に、statement block を実行します。繰り返しの間、endvalue に達するまで、stepvalue ずつ、iterator(反復子) が増加します。
stepvalue を指定しないと、stepvalue は、1 が使われます。
stepvalue と
endvalue の値は、
For 命令文を実行すると、すぐ内部に保存されます。そして、どちらも
For ループの間に変えられることはありません。
< と > のような比較演算子は、
stepvalue や
endvalue として効果はありません。ループを実行している間、式は再評価されないからです。
(
stepvalue と
endvalue を定めるために使われる式の結果は、変わるかもしれません。しかし、この変化は、
For ループの実行に影響しません。)
例を参照下さい。
注意:
いくつかの方言では、
stepvalue と
endvalue を保持している一時的な変数は、ループの終わりで、範囲から出ます。そして、これらの値は、何かループに従うコードが実行されると、不変のままである保証はありません。
この理由から、
For...Next ループから(
Goto などを使って)決して枝分かれしないことを推奨します。そして、
-lang fb か
-lang deprecated 方言では、後で、ループ内に飛び戻ります。
反復子は、固有のスカラーでなければなりません:
Static/
Shared 変数と局所変数だけを、使うことができます;
他のいかなる種類も、使うことができません。配列要素、UDTメンバー、
Byref パラメータ、どんな間接参照されたアドレスも、ダメです。
iterator は、
as datatype 構文を使って、
For 命令文と同じ範囲を持つように設定できます。
この構文で、
iterator は、
For...Next 範囲の中で作成されて、ループを抜けると破棄されます。
下の、例と、方言の違いを参照してください。
endvalue が、startvalue より少ないならば、負数の stepvalue を指定しなければなりません。さもないと、statement block は、まったく実行されません。startvalue は、endvalue 以上に匹敵するからです。
For 命令文は、iterator が endvalue に対してより大きく匹敵するまで(あるいは、stepvalue < 0 ならば endvalue 未満)、命令文の実行をstatement block 内で引き起こします。
iterator は、各々の statement block の実行後、stepvalue の量を増加されます。
増分(stepvalue) が与えられないなら、iterator は、暗黙のうちに 1 ずつ増加されます。
statement block 内で、
Exit For 命令文に出くわすと、ループは終了されます。そして、実行は、
Next 命令文で囲まれた続きから、すぐ再開します。
Continue For 命令文に出会うと、残りの
statement block は、ブロックの対応する
Next 命令文までスキップされます。
そして、カウンターの値は、増加します。ここで、カウンターの値が、まだ
endvalue で与えられた境界の内にあるなら、ループは再開します。
注意:
整数データ型では、その制約から、変数型に保存できる最も大きい値を超えてループ・アップ、また、保存できる最も小さい値を超えてループ・ダウンすることはできません。増加する変数が
endvalue を上回るときループが途切れるだけだからです。
変数の値が、変数型の制約を超えることは、決して起こりえません。
たとえば、変数の値を
0 から
255 まで繰り返そうとするならば、ループは、変数が
256 以上に達したときにだけ、途切れます。
このとき、カウンターに
UByte 型の変数を使うと、機能しません。なぜなら、
0 〜
255 の数を持つことはできますが、
256 を持つことができないからです。
標準的なデータ型の上下の限度について、
標準のデータ型と制限 を参照して下さい。
すべての流れ制御命令文と同様に、For 命令文は、入れ子にできます。つまり、これは、他の For 命令文の命令文ブロックで使われることができます。
例:
Print " 3〜0 まで、-0.5 のステップで数えて表示します"
For i As Single = 3 To 0 Step -0.5
Print "i は " & i
Next i
' Print "ループを抜けた後の i は " & i 'ループを抜けると、変数 i は使えない
Sleep
Dim As Integer i, j, k, toTemp, stepTemp
j = 9: k = 1
For i = 0 To j Step k
j = 0: k = 0 '' j と k を変えても、現在のループに影響しません
Print i;
Next i
Print
' 内部的、これは、上の例がすることです:
j = 9: k = 1
i = 0: toTemp = j: stepTemp = k
Do While IIf(stepTemp >= 0, i <= toTemp, i >= toTemp)
j = 0: k = 0 '' j と k を変えても、現在のループに影響しません
Print i;
i += stepTemp
Loop
Print
Ubyte 反復子(255) の最高値までの増加ループで、For...Next が無限ループする例:
For ub As UByte = 240 To 255 '' UByte 反復子では、終了判定基準値(255+1=256)に到達できないので、無限ループになる
Print ub
If Inkey <> "" Then Exit For
Sleep 10
Next ub
同じことは、減少ループ (負の
stepvalue)の場合、UByte 反復子の最低値(0)でも発生します。
方言差:
-
-lang fb と -lang deprecated 方言では、For..Next ブロックの中で宣言された変数は、ブロックの中だけで目に見えて、ブロックの外ではアクセスできません。
このブロックの外側でグローバルとして定義された重複シンボルにアクセスするには、プレフィックスとして 1つまたはできれば 2つのドットを追加します: .SomeSymbol またはできれば ..SomeSymbol(With..End With ブロック内の場合は ..SomeSymbol のみ)。
-
-lang qb と -lang fblite 方言では、変数は、For..Next ブロックの中で宣言されて (宣言されれば、カウンターを含み、endvalue か stepvalue を保持するために使われる、一時的な変数を含みます)、QB の場合のように、手続きに広がる scope を持っています。
QBからの違い:
- カウンタとして Byref 引数を使用できません。
参照: