FOR (For)

自由形式構文 FOR{(MR)} 指標名 {= 開始値} {BY 増分} {TO|DOWNTO 限界}
コード 演算項目 1 拡張演算項目 2
FOR 指標名 = 開始値 BY 増分 TO | DOWNTO 限界

FOR 命令は、命令のグループを開始してそのグループを処理する回数を制御 します。命令グループを処理する回数を指示するためには、指標名、開始値、 増分値、および限界値を指定します。オプションの開始値、増分値、 および限界値は、自由形式の式にすることができます。 対応する END または ENDFOR ステートメント が、このグループの終わりを指示します。 FOR グループの詳細について は、構造化プログラミング命令を参照してください。

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 命令は、次のように実行されます。

  1. FOR 命令は、FOR ステートメント行の条件付け標識が満たされた場合 に処理されます (ステップ 2)。この標識が満たされない場合には、対応する END、または ENDFOR ステートメントの後で処理される次の命令に 制御が渡されます (ステップ 8)。
  2. 初期値が指定されている場合、指標名に割り当てられます。 指定されていなければ、指標名は、ループの開始前と同じ値を保存します。
  3. 限界値が指定されている場合、指標名に対して評価、比較されます。 限界値が指定されていない場合、ループは、ループを終了する ステートメント (LEAVE や GOTO など) またはプログラムかプロシージャー を終了するステートメント (RETURN など) を検出するまで、無限に繰り返します。

    TO 文節が指定され、指標名の値が限界値より大きい場合、制御 は、ENDFOR ステートメント以降の最初のステートメントに渡されます。 DOWNTO が指定され、指標名が限界値より小さい場合、制御は、ENDFOR の 後の最初のステートメントに渡されます。

  4. FOR グループ内の命令が処理されます。
  5. END または ENDFOR ステートメントの条件付き標識が 満たされない場合、制御は、対応する END または ENDFOR の後のステートメントに 渡され、ループは終了します。
  6. 増分値が指定されている場合、その値が評価されます。 指定されていなければ、デフォルト値として 1 を使用します。
  7. 増分値は、指標名に加算 (TO の場合) されるか、指標名から減算 (DOWNTO の 場合) されます。 制御はステップ 3 に 渡されます (制御がステップ 3 に渡された時に FOR ステートメントの条件付け標識は 再びテスト (ステップ 1) されないことに注意してください)。
  8. FOR、END、または ENDFOR ステートメントの条件付け標識が 満たされない (ステップ 1 または 5) とき、指標値が限界値より 大きい (TO の場合) か小さい (DOWNTO の場合) とき (ステップ 3)、また は指標値がオーバーフローしたときには、END または ENDFOR ステートメント の後のステートメントが処理されます。
注:
FOR ループが n 回実行された 場合、限界値は n+1 回評価され、増分値 は n 回評価されます。このことは、限界値 または増分値が複雑で、評価に時間がかかる場合や、限界値または増分値 に副次作用のあるサブプロシージャーへの呼び出しが含まれている場合 には、重要になる可能性があります。 限界または増分の多重評価が不要な場合は、FOR ループの前の一時の中の値を 計算し、FOR ループ内の一時を使用します。

FOR 命令を指定する場合には次のことに留意してください。

これらの命令が FOR 命令にどのような影響を与えるかについて は、LEAVE (Do/For グループからの抜け出し)および ITER (繰り返し)を参照してください。

詳細については、構造化プログラミング命令を参照してください。

図 296. FOR 命令の例
 *..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