FOR (For)
| 自由形式構文 | FOR{(MR) } 指標名 {= 開始値 } {BY 増分 } {TO|DOWNTO 限界 } |
| コード | 演算項目 1 | 拡張演算項目 2 | ||||
|---|---|---|---|---|---|---|
| FOR | 指標名 = 開始値 BY 増分 TO | DOWNTO 限界 | |||||
FOR 命令は、命令のグループを開始してそのグループを処理する回数を制御 します。命令グループを処理する回数を指示するためには、指標名、開始値、 増分値、および限界値を指定します。オプションの開始値、増分値、 および限界値は、自由形式の式にすることができます。 対応する END または ENDFOR ステートメント が、このグループの終わりを指示します。 FOR グループの詳細について は、構造化プログラミング命令を参照してください。
FOR 指標名 { = 開始値 }
{ BY 増分値 }
{ TO | DOWNTO 限界値 }
{ ループ本体 }
ENDFOR | END
開始値、増分値、および限界値 は、小数点以下の桁数がゼロの数値または式にすることができます。 増分値が指定されている場合、この値はゼロにはできません。
BY および TO (または DOWNTO) 文節は、どの順序でも指定できます。 "BY 2 TO 10" と "TO 10 BY 2" は両方とも可能です。
FOR 命令自体のほかに、FOR グループは、FOR および ENDFOR (また は END) ステートメントおよび ENDFOR ステートメントの条件付け標識によっても制御 されます。 FOR ステートメントの条件付け標識は、FOR 命令を開始するかどうかを 制御します。これらの標識は for ループの始めに 1 回だけ 検査されます。対応する END または ENDFOR ステートメントの条件付け標識 は、FOR グループをもう一度繰り返すかどうかを制御します。 これらの標識はそれぞれのループの終わりに検査されます。
- FOR 命令は、FOR ステートメント行の条件付け標識が満たされた場合 に処理されます (ステップ 2)。この標識が満たされない場合には、対応する END、または ENDFOR ステートメントの後で処理される次の命令に 制御が渡されます (ステップ 8)。
- 初期値が指定されている場合、指標名に割り当てられます。 指定されていなければ、指標名は、ループの開始前と同じ値を保存します。
- 限界値が指定されている場合、指標名に対して評価、比較されます。
限界値が指定されていない場合、ループは、ループを終了する
ステートメント (LEAVE や GOTO など) またはプログラムかプロシージャー
を終了するステートメント (RETURN など) を検出するまで、無限に繰り返します。
TO 文節が指定され、指標名の値が限界値より大きい場合、制御 は、ENDFOR ステートメント以降の最初のステートメントに渡されます。 DOWNTO が指定され、指標名が限界値より小さい場合、制御は、ENDFOR の 後の最初のステートメントに渡されます。
- FOR グループ内の命令が処理されます。
- END または ENDFOR ステートメントの条件付き標識が 満たされない場合、制御は、対応する END または ENDFOR の後のステートメントに 渡され、ループは終了します。
- 増分値が指定されている場合、その値が評価されます。 指定されていなければ、デフォルト値として 1 を使用します。
- 増分値は、指標名に加算 (TO の場合) されるか、指標名から減算 (DOWNTO の 場合) されます。 制御はステップ 3 に 渡されます (制御がステップ 3 に渡された時に FOR ステートメントの条件付け標識は 再びテスト (ステップ 1) されないことに注意してください)。
- FOR、END、または ENDFOR ステートメントの条件付け標識が 満たされない (ステップ 1 または 5) とき、指標値が限界値より 大きい (TO の場合) か小さい (DOWNTO の場合) とき (ステップ 3)、また は指標値がオーバーフローしたときには、END または ENDFOR ステートメント の後のステートメントが処理されます。
- FOR 命令では指標名を宣言できません。 変数は、定義仕様書内で宣言する必要があります。
- 指標名 は、指標付き配列要素を含む完全修飾名にすることができます。
これらの命令が FOR 命令にどのような影響を与えるかについて は、LEAVE (Do/For グループからの抜け出し)および ITER (繰り返し)を参照してください。
詳細については、構造化プログラミング命令を参照してください。
*..1....+....2....+....3....+....4....+....5....+....6....+....7...+....
/free
// Example 1
// Compute n!
factorial = 1;
for i = 1 to n;
factorial = factorial * i;
endfor;
// Example 2
// Search for the last nonblank character in a field.
// If the field is all blanks, "i" will be zero.
// Otherwise, "i" will be the position of nonblank.
for i = %len (field) downto 1;
if %subst(field: i: 1) <> ' ';
leave;
endif;
endfor;
// Example 3
// Extract all blank-delimited words from a sentence.
WordCnt = 0;
for i = 1 by WordIncr to %len (Sentence);
// Is there a blank?
if %subst(Sentence: i: 1) = ' ';
WordIncr = 1;
iter;
endif;
// We've found a word - determine its length:
for j = i+1 to %len(Sentence);
if %subst (Sentence: j: 1) = ' ';
leave;
endif;
endfor;
// Store the word:
WordIncr = j - i;
WordCnt = WordCnt + 1;
Word (WordCnt) = %subst (Sentence: i: WordIncr);
endfor;
/end-free