13.2.4 The For..to/downto..do statement

Free Pascal supports the For loop construction. A for loop is used in case one wants to calculate something a fixed number of times. The prototype syntax is as follows:

_________________________________________________________________________________________________________
For statement

 --           -   -            -   -          -----  -----
   for-statement  for control- variable :=   initial- value -  to  --|
----final- value -do -statement------------------------downto-----------

--control- variable-variable-identifier-----------------------------------

--initial- value expression -------------------------------------------

--        -         --------------------------------------------
  final- value expression
____________________________________________

Here, Statement can be a compound statement. When the For statement is encountered, the control variable is initialized with the initial value, and is compared with the final value. What happens next depends on whether to or downto is used:

  1. In the case To is used, if the initial value is larger than the final value then Statement will never be executed.

  2. In the case DownTo is used, if the initial value is less than the final value then Statement will never be executed.

After this check, the statement after Do is executed. After the execution of the statement, the control variable is increased or decreased by 1, depending on whether To or Downto is used. The control variable must be an ordinal type, no other types can be used as counters in a loop.

Remark

The following are valid loops:

For Day := Monday to Friday do Work;
For I := 100 downto 1 do
  WriteLn ('Counting down : ',i);
For I := 1 to 7*dwarfs do KissDwarf(i);

The following will generate an error:

For I:=0 to 100 do
  begin
  DoSomething;
  I:=I*2;
  end;

because the loop variable I cannot be assigned to inside the loop.

The following will also generate an error:

program test;

{$ifdef fpc}
{$mode delphi}
{$h+}
{$endif}

procedure Proc;
var
  i: integer;
  procedure Nested;

  begin
    for i := 1 to 2 do ;
  end;

begin
end;

begin
end.

because the variable I is not defined in Nested and it’s not a global variable either.

But the following will compile:

program test;

{$ifdef fpc}
{$mode delphi}
{$h+}
{$endif}

var
  i: integer;

procedure Nested;

begin
  for i := 1 to 2 do ;
end;

begin
end.

If the statement is a compound statement, then the Break and Continue system routines can be used to jump to the end or just after the end of the For block statement: in the case of Continue, this means that the for loop condition is again evaluated. In the case of nested loops, only the innermost loop is considered. Note that Break and Continue are not reserved words and therefore can be overloaded.