всегда постоянный и равен «интервалу» между двумя ближайшими значениями типа параметра цикла. Изменение параметра цикла может быть возрастающим, но может быть и убывающим. В первом случае МладшееЗначение должно быть не больше чем Старшее, а во втором — наоборот. Примеры оформления циклов с параметром приведены на рис. 6.2.
| VAR
| > i : Integer; { описание параметров циклов}
| > c : Char;
| > b : Boolean;
| > e : (elem1, elem2, elem3 ); {вводимый перечислимый тип}
| BEGIN
| > FOR i:= -10 TO 10 DO Writeln(i);
| > FOR i:= 10 DOWNTO -10 DO Writeln(i);
| > FOR c:= 'a' TO 'r' DO Writeln(с);
| > FOR b:=True DOWNTO False DO Writeln(b);
| > FOR e:= elem1 TO elem3 DO Writeln(Ord(e));
| END.
Рис. 6.2
Если параметр возрастает, то между границами его значений ставится слово TO, если же убывает, то ставится слово DOWNTO. Соответственно с этим меняются местами старшее и младшее зна-
- 102 -
чения в заголовке цикла. На месте старших и младших значений могут стоять константы (как на рис. 6.2), а могут и переменные или выражения, совместимые по присваиванию с параметром цикла. Выполнение цикла начинается с присваивания параметру стартового значения. Затем следует проверка, не превосходит ли параметр конечное значение (случай с TO) или не является ли он меньше конечного значения (случай с DOWNTO). Если результат проверки утвердительный, то цикл считается завершенным и управление передается следующему за телом цикла оператору. В противном случае выполняется тело цикла, и после этого параметр меняет свое значение на следующее, согласно заголовку цикла. Далее снова производится проверка значения параметра цикла, т.е. алгоритм повторяется. Из этого следует, что будут проигнорированы циклы
FOR i := 5 ТО 4 DO ...;
FOR i : = 4 DOWNTO 5 DO ...;
а цикл
FOR i := N TO N DO ...;
выполнит операторы своего тела строго один раз.
Запрещается изменять параметр цикла и его старшее и младшее значения (если они заданы переменными или выражениями с ними) изнутри тела цикла. Кроме того, параметр цикла не может участвовать в построении диапазонов этого же цикла. Компилятор таких «незаконных» действий не замечает, но программа, содержащая цикл с заголовком типа
FOR i := i-5 TO i+5 DO ...
не заслуживает никакого доверия, даже если запускается. Если же необходимо досрочно завершить цикл FOR (для чего велик соблазн искусственно «подрастить» параметр цикла), то можно воспользоваться оператором перехода Goto (о нем см. следующий раздел). В техническом описании Турбо Паскаля отмечается, что после завершения цикла FOR значение его параметра не определено. При экспериментальной проверке этого факта скорее всего получится обратный результат: параметр будет иметь конечное значение своего диапазона. Тем не менее, не следует опираться на это в своих программах. Лучше переприсвоить значение параметра после окончания цикла — так будет корректнее. Исключение — выход из цикла переходом Goto. В этом случае значение переменной (параметра цикла) останется таким же, каким было на момент выполнения оператора Goto.