Операторы цикла с параметром (которые начинаются со слова
for) вызывает повторяющееся выполнение оператора (который может
быть составным оператором) пока управляющей переменной присваива-
ется возрастающая последовательность значений.
┌───┐ ┌───────────┐ ┌──┐ ┌────────┐
оператор ───>│for├──>│управляющая├──>│:=├──>│исходное├───┐
for └───┘ │переменная │ └──┘ │значение│ │
└───────────┘ └────────┘ │
┌────────────────────────────────────────────────┘
│ ┌──┐
│ ┌─>│to├─────┐ ┌────────┐ ┌──┐ ┌────────┐
└───┤ └──┘ ├──>│конечное├──>│do├──>│оператор├───>
│ ┌──────┐ │ │значение│ └──┘ └────────┘
└─>│downto├─┘ └────────┘
└──────┘
┌────────────────────────┐
управляющая переменная ───>│идентификатор переменной├───>
└────────────────────────┘
┌─────────┐
исходное значение ────>│выражение├───>
└─────────┘
┌─────────┐
конечное значение ────>│выражение├───>
└─────────┘
В качестве управляющей переменной должен использоваться
идентификатор переменой (без какого-либо квалификатора), который
обозначает переменную, объявленную локальной в блоке, в котором
содержится оператор for. Управляющая переменная должна иметь пе-
речислимый тип. Начальное и конечное значения должны иметь тип,
совместимый по присваиванию с перечислимым типом.
Примечание: О локальности и области действия рассказы-
вается в Главе 8.
Когда начинает выполняться оператор for, начальное и конеч-
ное значения определяются один раз, и эти значения сохраняются на
протяжении всего выполнения оператора for.
Оператор, который содержится в теле оператора for, выполня-
ется один раз для каждого значения в диапазоне между начальным и
конечным значением. Управляющая переменная всегда инициализирует-
ся начальным значением. Когда работает оператор for, значение уп-
равляющей переменной (счетчика циклов) увеличивается при каждом
повторении на единицу. Если начальное значение превышает конечное
значение, то содержащийся в теле оператора for оператор не выпол-
нятся. Когда в операторе цикла используется ключевое слово
downto, значение управляющей переменной уменьшается при каждом
повторении на единицу. Если начальное значение в таком операторе
меньше, чем конечное значение, то содержащийся в теле оператора
цикла оператор не выполнятся.
Если оператор, содержащийся в теле оператора for, изменяет
значение управляющей переменной, то это является ошибкой. После
выполнения оператора for значение управляющей переменной стано-
вится неопределенным, если только выполнение оператора for не бы-
ло прервано с помощью оператора перехода.
Если принять во внимание эти ограничения, то оператор
for V := Expr1 to Expr2 do Body;
эквивалентен оператору:
begin
Temp1 := Expr1;
Temp2 := Expr2;
if Temp1 <= Temp2 then
begin
V := Temp1;
Body;
while V <> Temp2 do
begin
V := Succ(V);
Body;
end;
end;
end;
и оператор цикла:
for V := Expr1 downto Exp2 do Body;
эквивалентен операторам:
begin
Temp1 := Expr1;
Temp2 := Expr2;
if Temp1 >= Temp2 then
begin
V := Temp1;
Body;
while V <> Temp2 o
begin
V := Pred(V);
Body;
end;
end;
end;
где Temp1 и Temp2 - вспомогательные переменные, тип которых сов-
падает с основным типом переменной V и которые не встречаются в
другом месте программы.
Приведем примеры оператора цикла с параметром:
for I := 2 to 63 do
if Data[I] > Max then Max := Data[I]
for I := 1 to 10 do
for J := 1 to 10 do
begin
X := 0;
for K := 1 to 10 do
X := X + Mat1[I,K]*Mat2[K,J];
Mat[I,J] := X;
end;
for C := red to blue do Check(C);