FreeBASIC マニュアルのトップに戻る

FreeBASIC Fornext

目次→言語リファレンス→命令文→流れ制御命令FOR...NEXT←オリジナル・サイト

FOR...NEXT 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

繰り返しのための、流れ制御命令文

構文:
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 が使われます。

stepvalueendvalue の値は、For 命令文を実行すると、すぐ内部に保存されます。そして、どちらも For ループの間に変えられることはありません。
< と > のような比較演算子は、stepvalueendvalue として効果はありません。ループを実行している間、式は再評価されないからです。
stepvalueendvalue を定めるために使われる式の結果は、変わるかもしれません。しかし、この変化は、For ループの実行に影響しません。)
例を参照下さい。

注意:
いくつかの方言では、stepvalueendvalue を保持している一時的な変数は、ループの終わりで、範囲から出ます。そして、これらの値は、何かループに従うコードが実行されると、不変のままである保証はありません。
この理由から、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 命令文は、iteratorendvalue に対してより大きく匹敵するまで(あるいは、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 型の変数を使うと、機能しません。なぜなら、0255 の数を持つことはできますが、256 を持つことができないからです。
標準的なデータ型の上下の限度について、標準のデータ型と制限 を参照して下さい。

すべての流れ制御命令文と同様に、For 命令文は、入れ子にできます。つまり、これは、他の For 命令文の命令文ブロックで使われることができます。

ForNextStep は、ユーザ定義型の中で、多重定義できる演算子です。
参照: 演算子 For演算子 Next演算子 Step

例:
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)でも発生します。

方言差:

QBからの違い:
参照:
流れ制御命令 に戻る
←リンク元に戻る プログラム開発関連に戻る
ページ歴史:2021-09-28 09:53:25
日本語翻訳:WATANABE Makoto、原文著作者:SysOp

ホームページのトップに戻る

表示-非営利-継承