Хелпикс

Главная

Контакты

Случайная статья





Определения для оператора 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 определяется аналогично.

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.