Операторы описывают  те алгоритмические  действия,  которые  должны выполняться.  Операторам могут предшествовать метки, которые можно использовать для ссылок в операторах перехода goto.

   оператор ДДВДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДДДДДДДДДДДДДДДДДД>

  і  ЪДДДДДї  ЪДДДї ^ і  ЪДДДДДДДДДДДДДДДДї  ^

  АД>іметкаГДД>і : ГДЩ ГДД>іпростой операторГДДґ

  АДДДДДЩ   АДДДЩ  і   АДДДДДДДДДДДДДДДДЩ  і

 і   ЪДДДДДДДДДДДДДДДДї  і

 АДД>і  структурный   ГДДЩ

   і  оператор  і

  АДДДДДДДДДДДДДДДДЩ

Метка - это последовательность цифр в диапазоне от 0 до 9999  или идентификатор.

Существует два основных вида операторов: простые операторы и  структурные операторы.

Простым оператором является такой оператор,  который не  содержит в себе других операторов.

 ЪДДДДДДДДДДДДДДДДДДДДДї

   простой оператор ДДДДВДДД>іоператор присваивания ГДДДДДДД>

   і АДДДДДДДДДДДДДДДДДДДДДЩ   ^

   і ЪДДДДДДДДДДДДДДДДДДДДДї   і

   ГДДД>і оператор процедуры  ГДДДґ

   і АДДДДДДДДДДДДДДДДДДДДДЩ   і

   і ЪДДДДДДДДДДДДДДДДДДДДДї   і

   АДДД>і оператор перехода   ГДДДЩ

 АДДДДДДДДДДДДДДДДДДДДДЩ

Оператор присваивания заменяет текущее  значение  переменной  новым значением,  которое определяется выражением, или определяет  выражение, значение которого должно возвращаться функцией.

   ЪДДДДДДДДДДДї ЪДДї  ЪДДДДДДДДДї

   оператор ДДДДДВДД>іссылка на  ГДДДДДД>і:=ГДД>івыражениеГДД>

   присваивания  і  іпеременную і   ^   АДДЩ  АДДДДДДДДДЩ

  і   АДДДДДДДДДДДЩ   і

  і   ЪДДДДДДДДДДДДДї і

 АДД>іидентификаторГДЩ

   і   функции  і

   АДДДДДДДДДДДДДЩ

Выражение должно быть совместимо по присваиванию с типом переменной  или  типом значения,  возвращаемого функцией в качестве  результата (см. раздел "Совместимость типов" в Главе 4).

Приведем некоторые примеры операторов присваивания:

X := Y + Z

Done := (I >= 1) and (I < 100);

Huel := [blue, Succ(C)];

I := Sqr(J) - I * K;

Присваивания объектного типа

Правила совместимости по присваиванию объектных типов позволяют присваивать  экземпляру объекта экземпляр любого из его дочерних типов.  Такое присваивание  представляет  собой проекцию  потомка на  пространство  его предка.  В примере исходного кода в  Главе 4 с учетом экземпляра F типа TField  и  экземпляра  Z  типа  TZipField присваивание  F := Z копирует только поля X,  Y, Len и  Name.

Присваивание экземпляру объектного  типа  не инициализирует  экземпляр. Например, в предыдущем примере присваивание F := Z означает, что вызов конструктора для F можно опустить.

Оператор процедуры определяет активизацию процедуры, обозначенную  с помощью идентификатора процедуры.  Если соответствующее  описание процедуры содержит список формальных параметров, то оператор процедуры должен содержать в себе соответствующий ему список фактических параметров (параметры,  список которых приводится  в определении,  являются формальными параметрами,  а в операторе  вызова процедуры они являются фактическими параметрами).  При вызове происходит передача фактических параметров формальным параметрам.

   ЪДДДДДДДДДДДДДї

   оператор  ДДВД>іидентификаторГДВВДДДДДДДДДДДДДДДДДДДДДДДДДД>

   процедуры   і  і  процедуры і іі  ЪДДДДДДДДДДДДДДДДДДї ^

   і  АДДДДДДДДДДДДДЩ іАД>ісписок фактическихГДЩ

   і  ЪДДДДДДДДДДДДДї і   і  параметров   і

   ГД>і десигнатор  ГДґ  АДДДДДДДДДДДДДДДДДДЩ

   і  і метода  і і

   і  АДДДДДДДДДДДДДЩ і

   і  ЪДДДДДДДДДДДДДї і

   ГД>і  уточненный ГДґ

   і  і десигнатор і і

   і  і метода  і і

   і  АДДДДДДДДДДДДДЩ і

   і  ЪДДДДДДДДДДДДДї і

  АД>і ссылка на  ГДЩ

   і переменную  і

   АДДДДДДДДДДДДДЩ

Приведем некоторые примеры операторов процедур:

PrintHeaing;

Transpose(A,N,M);

Fin(Name,Address);

Оператор перехода goto вызывает передачу управления оператору, которому предшествует метка, указанная в данном операторе перехода.  Синтаксическая схема оператора перехода имеет  следующий  вид:

  ЪДДДДї ЪДДДДДї

  оператор перехода ДДД>іgotoГДДД>іметкаГДДД>

  АДДДДЩ АДДДДДЩ

При использовании оператора перехода должны соблюдаться следующие правила:

1.  Метка,  которая указывается в операторе перехода, должна  находиться в том же блоке или модуле, что и сам оператор  перехода.  Другими словами,  не допускаются переходы из  процедуры или функции или внутрь нее.

2.  Переход извне внутрь структурного оператора (то есть переход  на более глубокий уровень вложенности) может вызвать непредсказуемые эффекты,  хотя компилятор не выдает  сообщения об ошибке. Например, вы не должны переходить в  тело цикла for.

Примечание: Хорошая практика программирования  требует  минимального использования переходов.

Структурные операторы строятся из других операторов, порядок  выполнения которых должен быть последовательным (составные операторы и операторы над записями), определяемым условной передачей  управления (условные операторы) или повторяющимся (операторы цикла).

  ЪДДДДДДДДДДДДДДДДДДДДДДДї

  структурный ДДДДВДДДД>і  составной оператор   ГДДДДДДД>

  оператор  і АДДДДДДДДДДДДДДДДДДДДДДДЩ   ^

   і  ЪДДДДДДДДДДДДДДДДДДДДДДДї   і

   ГДДДД>і   условный оператор   ГДДДґ

   і  АДДДДДДДДДДДДДДДДДДДДДДДЩ   і

  і ЪДДДДДДДДДДДДДДДДДДДДДДДї   і

   ГДДДД>і оператор цикла  ГДДДґ

   і  АДДДДДДДДДДДДДДДДДДДДДДДЩ   і

   і  ЪДДДДДДДДДДДДДДДДДДДДДДДї   і

   АДДДД>і оператор над записями ГДДДЩ

  АДДДДДДДДДДДДДДДДДДДДДДДЩ

Составные операторы  задают порядок  выполнения операторов,  являющихся их элементами. Они должны выполняться в том порядке, в  котором  они  записаны.  Составные операторы обрабатываются,  как  один оператор,  что имеет решающее значение  там, где  синтаксис  Паскаля допускает использование только одного оператора. Операторы заключаются в ограничители begin и end,  и отделяются друг  от друга точкой с запятой.

  ЪДДДДДї ЪДДДДДДДДї  ЪДДДї

  составной ДДДД>іbeginГДДДДДД>іоператорГДДДДВДД>іendГДД>

  оператор  АДДДДДЩ   ^   АДДДДДДДДЩ і  АДДДЩ

   і ЪДДДї і

   АДДДДДґ ; і<ДДДДДДЩ

   АДДДЩ

Приведем пример составного оператора:

begin

   Z := X;

   X := Y;

   Y := Z;

end;

Условные операторы  позволяют выбрать для выполнения один из составных операторов (или не выбрать ни одного).

  ЪДДДДДДДДДДДДДДДї

  условный оператор  ДДВДД>і оператор if   ГДДДДДДД>

  і   АДДДДДДДДДДДДДДДЩ   ^

 і  ЪДДДДДДДДДДДДДДДї   і

  АДД>і оператор case ГДДДЩ

  АДДДДДДДДДДДДДДДЩ

Синтаксис оператора if можно представить  следующим образом:

  ЪДДї   ЪДДДДДДДДДї   ЪДДДДї   ЪДДДДДДДДї

   оператор if Д>іifГДД>івыражениеГДД>іthenГДД>іоператорГДДВДДї

  АДДЩ   АДДДДДДДДДЩ   АДДДДЩ   АДДДДДДДДЩ  і  і

ЪДДДДДДДДДДДДДДДДДДДДДДДДЩ  і

і   ЪДДДДї  ЪДДДДДДДДї  v

    АДД>іelseГДД>іоператорГДДДДДДДДД>

 АДДДДЩ   АДДДДДДДДЩ

В выражении должен получаться результат, имеющий стандартный  булевский тип.  Если результатом выражения является истинное значение (True), то выполняется оператор, следующий за ключевым словом then.

 

Если результатом  выражения является  значение False и присутствует ключевое слово else,  то выполнятся оператор, следующий  за ключевым словом else. Если ключевое слово else отсутствует, то  никакой оператор не выполняется.

Синтаксическая неоднозначность, возникающая в конструкции:

if e1 then e2 else e3
разрешается путем следующей интерпретации этой конструкции:

if e1 then

begin

   if e2 then

   s1

   else

   s2

end

Примечание: В  предшествующем операторе else двоеточие  не указывается.

В общем случае ключевое слово else связывается  с  ближайшим  ключевым  словом  if,  которое еще  не связано с ключевым словом  else.

Приведем два примера оператора if:

  if X < 1.5 then

Z := X+Y

  else

Z := 1.5;

 

 if P1 <> nil then

  P1 := P1^.father;

Оператор варианта  (casе) состоит из выражения (переключателя) и списка операторов, каждому из которых предшествует одна или  более констант (они называются константами выбора)  или  ключевое  слово else.  Переключатель (селектор) должен иметь порядковый тип  (размером в байт или слово). Таким образом, строковый тип и длинный целый  тип являются недопустимыми типами переключателя.  Все  константы выбора должны быть уникальными и иметь порядковый  тип,  совместимый с типом переключателя.

ЪДДДДї   ЪДДДДДДДДДї   ЪДДї   ЪДДДДї

   оператор case Д>іcaseГДД>івыражениеГДД>іofГДДДДД>іcaseГДДВДДї

АДДДДЩ   АДДДДДДДДДЩ   АДДЩ  ^   АДДДДЩ і  і

  і   ЪДДДДї  і  і

  АДДДґ ;  і<ДЩ  і

АДДДДЩ  і

 ЪДДДДДДДДДДЩ

  і ЪДДДї

  АДВДДДДДДДДДДДДДДДДДДДДВДДДДДДДДДД>іendГДД>

і   ЪДДДДДДДДДДї  ^  і  ЪДДДї ^ АДДДЩ

АДД>іветвь elseГДДЩ  АД>і ; ГДДЩ

 АДДДДДДДДДДЩ  АДДДЩ

 

 ЪДДДДДДДДДДДДДДДДДДДДї

  ЪДДДДДДДДДї і  ЪДДї ЪДДДДДДДДДї v   ЪДДДї  ЪДДДДДДДДї

   case ДД>іконстантаГДБД>і..ГД>іконстантаГДДВД>і : ГД>іоператорГД>

  ^  АДДДДДДДДДЩ АДДЩ  АДДДДДДДДДЩ і  АДДДЩ  АДДДДДДДДЩ

  і ЪДДДї  і

  АДДДДДДДДДДДДДДДДДґ , і<ДДДДДДДДДДДДДЩ

  АДДДЩ

 

   ЪДДДДї ЪДДДДДДДДї

   ветвь else ДДДД>іelseГДДД>іоператорГДДД>

    АДДДДЩАДДДДДДДДЩ

Оператор варианта case приводит к выполнению оператора,  которому предшествует константа выбора,  равная значению переключателя или диапазону выбора,  в котором находится значение переключателя.  Если такой константы выбора или такого диапазона  выбора  не существует и присутствует ветвь else,  то выполнятся оператор,  следующий за ключевым словом else.  Если же ветвь else отсутствует, то никакой оператор не выполняется.

Приведем некоторые примеры оператора варианта:

case Operator of

   plus:   X := X+Y;

   minus:  X := X-Y;

   times:  X := X*Y;

    end;

 

case I of

   0, 2, 4, 6, 8: Writeln('Четная цифра');

   1, 3, 5, 7, 9: Writeln('Нечетная цифра');

   10..100: Writeln('Между 10 и 100');

end;

Оператор цикла задает повторное выполнение определенных операторов.

    ЪДДДДДДДДДДДДДДДДДї

  оператор цикла  ДДДВДД>і оператор repeat ГДДДДДД>

   і   АДДДДДДДДДДДДДДДДДЩ  ^

   і   ЪДДДДДДДДДДДДДДДДДї  і

   ГДД>і оператор while  ГДДґ

   і   АДДДДДДДДДДДДДДДДДЩ  і

   і   ЪДДДДДДДДДДДДДДДДДї  і

   АДД>і оператор  for   ГДДЩ

    АДДДДДДДДДДДДДДДДДЩ

Если число повторений заранее известно,  то подходящей конструкций является оператор for. В противном случае следует использовать операторы while или repeat.

Для управления  повторением операторов  можно  использовать  стандартные процедуры Break и Continue.  Break завершает оператор  цикла, а Continue продолжает со следующей итерации этого оператора. Подробности вы можете найти в Главе 1 "Справочного  руководства программиста".

В операторе  цикла с  постусловием  (начинающимся  со слова  repeat) выражение, которое управляет повторным выполнением последовательности операторов содержится внутри оператора repeat.

  ЪДДДДДДї  ЪДДДДДДДДї  ЪДДДДДї   ЪДДДДДДДДДї

   оператор Д>іrepeatГДДДД>іоператорГДДВД>іuntilГДД>івыражениеГДД>

   repeat  АДДДДДДЩ  ^  АДДДДДДДДЩ і  АДДДДДЩ   АДДДДДДДДДЩ

   і ЪДДДї і

   АДДДДґ ; і<ДДДДЩ

  АДДДЩ

Результат выражения должен быть булевского типа.  Операторы,  заключенные  между ключевыми словами repeat и until,  выполняются  последовательно до тех пор,  пока результат выражения  не примет  значение True.  Последовательность операторов выполнится по крайней мере один раз,  поскольку вычисление  выражения производится  после каждого выполнения последовательности операторов.

Приведем примеры оператора цикла с постусловием:

repeat

   K := I mod J;

   I := J;

   J := K;

until J = 0;

 

repeat

   Write('Введите значение (0..9):');

   Readln(I);

until (I >= 0) and (I <= 9);

Оператор цикла с предусловием (начинающийся с ключевого слова while) содержит в себе выражение,  которое управляет повторным  выполнением  оператора (который может быть составным оператором).

ЪДДДДДї   ЪДДДДДДДДДї   ЪДДї   ЪДДДДДДДДї

   оператор ДДД>іwhileГДД>івыражениеГДД>іdoГДД>іоператорГДД>

   while  АДДДДДЩ  АДДДДДДДДДЩ   АДДЩ   АДДДДДДДДЩ

Выражение, с помощью которого осуществляется управление повторением оператора,  должно иметь булевский тип.  Вычисление его  производится  до  того,  как внутренний оператор будет выполнен.  Внутренний оператор выполнятся повторно до тех пор,  пока выражение принимает значение Тruе.  Если выражение с самого начала принимает значение False, то оператор, содержащийся внутри оператора  цикла с предусловием, не выполняется.

Примерами операторов цикла с предусловием могут служить следующие операторы:

while Data[I] <> X do I := I + 1;

 

While I > 0 do

begin

   if Odd(I) then Z := Z * X;

   I := I div 2;

   X := Sqr(X);

end;

 

while not Eof(InFile) do

begin

   Readln(InFile,Line);

   Process(Line);

end;

Операторы цикла с параметром (которые  начинаются  со слова  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);

 

В операциях над записями оператор with  удобно  использовать  для краткого обращения к полям записи. В операторе with к полям  одной или более конкретных переменных типа запись можно обращаться, используя  только идентификаторы полей.  Оперaтор with имеет  следующий синтаксис:

   ЪДДДДї   ЪДДДДДДДДДДДДДДДї  ЪДДї  ЪДДДДДДДДї

   оператор ДД>іwithГДДДДД>і   ссылка на  ГДДВД>іdoГДД>іоператорГ>

   with  АДДДДЩ  ^   іпеременную типаі  і  АДДЩ   АДДДДДДДДЩ

  і   ізапись  і  і

  і   і  или объект   і  і

  і   АДДДДДДДДДДДДДДДЩ  і

  і  ЪДДДї   і

  АДДДДДДДДґ , і<ДДДДДДДДЩ

  АДДДЩ

   ссылка на переменную  ЪДДДДДДДДДДДДДДДДДДДДї

   типа запись или объект  ДДД>іссылка на переменнуюГДД>

АДДДДДДДДДДДДДДДДДДДДЩ

Возьмем следующее описание:

type

   TDate = record

     Day   : Integer:

  Month : Integer;

  Year  : Integer:

   end;

 

var OrderDate: TDate;

С учетом данного описания приведем пример оператора with:

with OrderDate do

   if Month = 12 then

   begin

  Month := 1;

  Year := Year + 1

   end else

  Month := Month + 1;

Это эквивалентно следующему:

if OrderDate.Month = 12 then

begin

   OrderDate.Month := 1;

   OrderDate.Year := TDate.Year + 1

end

else

   Date.month := TDate.Month + 1;

  

   B.Pascal 7 & Objects/LR  - 132 -

В операторе with сначала производится проверка каждой ссылки  на переменную,  а именно: можно ли ее интерпретировать, как поле  записи. Если это так, то она всегда интерпретируется именно таким  образом, даже если имеется доступ к переменной с тем же именем.

Допустим описаны следующие переменные:

   type

  TPoint = record

   x,y: Integer;

end;

  var

x: Point;

y: Integer;

В этом случае и к x,  и к y можно обращаться, как к переменной или как к полю записи. В операторе:

   with x do

   begin

  x := 10;

  y := 25;

   end;

 x между  ключевыми  словами with и dо относится к переменной типа  указатель,  а в составном операторе x и y ссылаются на x.x и y.y.

Оператор:

with V1,V2,...Vn do s;

   эквивалентен операторам:

with V1 do

   with V2 do

...

   with Vn do

S;

В обоих случаях,  если Vn является полем и v1,  и v2, то она  интерпретируется как v2.Vn, а не как v1.Vn.

Если выборка переменной типа запись связана с индексированием массива или разыменованием указателя, то эти действия производятся до того, как будет выполняться составной оператор.