![]()
|
|||||||
Определения для оператора FOR.17.2.2. Определения для оператора FOR.
Синтаксические правила для оператора FOR:
<оператор FOR> ::= FOR <идентификатор переменной> := <список FOR> DO <оператор> <список FOR> ::= <выражение> TO <выражение> | <выражение> DOWNTO <выражение>
Контрольная переменная и выражения в списке FOR могут быть порядкового типа. Контрольная переменная должна быть идентификатором и не может появляться в левой части присваиваний внутри цикла. Значение контрольной переменной не определено после завершения выполнения оператора FOR. На некоторых Паскаль-машинах контрольная переменная может иметь значение после завершения оператора FOR, использование ее значения для дальнейших вычислений является плохой практикой, поскольку это не будет работать одинаково на всех Паскаль-машинах.
Значение оператора FOR может быть дано через эквивалентный оператор WHILE. Но нужно принимать во внимание несколько различий между двумя операторами. Наиболее очевидное соответствие неверно. Оператор FOR: FOR Index := E1 TO E2 DO S не эквивалентен: Index := E1; WHILE Index <=E2 DO BEGIN S; Index := SUCC(Index) END Контрольная переменная в операторе WHILE не является неопределенной после завершения цикла как это происходит в операторе FOR. Тело оператора WHILE будет выполнено последний раз, когда Index уже имеет то же значение что и E2. Если бы это значение было последним в перечислимом типе, последнее вычисление SUCC в теле цикла привело бы к аварийному завершению, чего не происходит в цикле FOR. Также, операторы присваивания в операторе S могут изменить количество итераций в операторе WHILE, чего не происходит в операторе FOR. Приведенный ниже операторFOR выполняет пять итераций, даже если First и Last изменяются после начала выполнения.
First := 1; Last := 5; FOR Index := First TO Last DO BEGIN First := First + 1; Last := Last – 1; WRITELN(Index, First, Last) END
Выполнение: OUTPUT: 1 2 4 2 3 3 3 4 2 4 5 1 5 6 0
Некоторые из этих различий могут быть устранены использованием контрольной переменной, которая более нигде в программе не появляется (скажем T1 и T2) и разворачиванием первого выполнения в цикле.
T1 := E1; T2 := E2; IF T1 <= T2 THEN BEGIN Index := T1; S; WHILE Index <> T2 DO BEGIN Index := SUCC(Index); S END END Хотя эта последовательность операторов ближе к значению оператора FOR, она по прежнему оставляет Index определенной в конце цикла. Прямое определение оператора FOR может быть дано следующим образом: FOR V := E1 TO E2 DO S где переменная V принадлежит порядковому типу T, имеет значение:
FOR V := E1 TO E2 DO S(t) = (VAR V: TT◦VAR V: T)(tn) если SUCCn-1 (E1) (t) = E2 (t), где tn = S ( V := SUCC(V) (tn-1)) … t1 = S ( V := E1 (t)); (VAR V: TT◦VAR V: T)(t) если (E1) (t) > E2 (t).
С помощью композиции VAR V: TT◦VAR V: T управляющая переменная удаляется из состояния выполнения б потом снова вставляется как будто была вновь объявлена. В результате, при выходе из оператора FOR она не определена.
Оператор FOR использующий DOWNTO определяется аналогично.
|
|||||||
|