логическая_операция : : = and | от | хот

операция_отношения : : = = I / = I < | <= | > | > = бинарная_аддитивная_операция : : = + | - | & унарная_аддитивная_операция : : = + | — мультипликативная_операция : : = * I / Г mod | rem операция_высшего_приоритета : : = ** | abs | mot

Формы управления с промежуточной проверкой and them и ©г else имеют тот же порядок старшинства, что и логические операции. Проверки принад­лежности in и not in имеют то же старшинство, что и операции отношения.

В слагаемом, простом выражении, отношении или выражении, группи­рование операций с их операндами проводится сначала для операций с боль­

шим старшинством, а затем для операций с меньшим старшинством. В слу­чае последовательных операций с одинаковым старшинством группирова­ние операций с их операндами производится в порядке их текстуального следования слева направо; для изменения порядка группирования могут использоваться скобки.

В языке не определяется порядок вычисления операндов множителя, слагаемого, простого выражения или отношения и операндов выражения, которое не содержит форм управления с промежуточной проверкой (но вычисление операндов производится до применения соответствующей опе­рации). Правый операнд формы управления с .промежуточной проверкой вычисляется тогда и только тогда, когда левый операнд имеет определенное значение (см. 4.5.1).

Для каждой формы описания типа некоторые из перечисленных опера­ций являются предопределенными, т. е. неявно задаются описанием типа. Для каждого такого неявного описания операции именами параметров являются LEFT и RIGHT для бинарных операций; для унарных аддитивных операций и унарных операций abs и not их единственный параметр именует­ся RIGHT. В разд. 4.5.1 - 4.5.7 поясняются результаты предопределенных операций.

Предопределенные операции над целыми типами либо вырабатывают математически корректный результат, либо возбуждают исключение NUME- RIC_ERROR. Предопределенная операция, вырабатывающая результат цело­го типа (отличного от универсального_ целого), может лишь возбуждать исключение NUMERIC_ERROR, только если математический результат не является значением этого целого типа. Предопределенные операции над ве­щественными типами вырабатывают результаты, точность которых опреде­ляется в соответствии с разд. 4.5.7. Предопределенная операция, вырабаты­вающая результат вещественного типа (отличного от универсального -ве­щественного), может возбуждать исключение NUMERIC _ERROR, только если ее результат не принадлежит диапазону хранимых чисел этого типа, как это поясняется в разд. 4.5.7.

Примеры старшинства

not СОЛНЦЕ or ТЕПЛО - - совпадает с (not СОЛНЦЕ) or ТЕПЛО

  • -

    X > 4.0 and Y > 0.0 -4.0 * А ** 2 abs (1 + А) + В Y ** (-3) A/В *С А + (В + С)

    совпадает с (X > 4.0) and (Y > 0.0)
  • - совпадает с - (4.0 » (А ** 2))

  • совпадает с (abs (1 + А)) + В

  • - скобки необходимы

  • - совпадает с (А/В) » С

  • - вычисляется В + С, а затем к результату прибавляется А

  1. Л о г и ч е с к и е операции и формы управления с промеж уточной проверкой

Приводимые в табл. 4.1 логические операции предопределены для лю­бых логических типов и любых одномерных индексируемых типов с ком­понентами логического типа. В обоих случаях операнды должны иметь один и тот же тип.


Таблица 4.1

Знак операции

Операция

Тип операнда

Тип результата

and

Конъюнкция

Любой логический тип Массив логических компо­нентов

Тот же логический тип

Тот же индексируемый тип

or

Дизъюнкция

Любой логический тип Массив логических компо­нентов

Тот же логический тип

Тот же индексируемый тип

xor

Исключающая

Любой логический тип

Тот же логический тип


ДИЗЪЮНКЦИЯ

Массив логических компо­нентов

Тот же индексируемый тип

Операции над массивами выполняются покомпонентно, если компонен­ты есть (как для равенства, см. 4.5.2). Границы массива-результата совпа­дают с границами левого операнда. Для каждого компонента левого операн­да проверяется наличие сопоставленного компонента правого операнда, и наоборот. При нарушении этого правила возбуждается исключение CONSTRAINT-ERROR.

Формы управления с промежуточной проверкой and then и or else опре­делены для двух операндов логического типа и вырабатывают результат то­го же самого типа. Левый операнд формы управления с промежуточной проверкой всегда вычисляется первым. Если левый операнд выражения с формой and then дает значение FALSE, то правый операнд не вычисляется, и значением выражения является FALSE. Если левый операнд выражения с формой or else дает TRUE, то правый операнд не вычисляется, и значением выражения является TRUE. Если вычисляются оба операнда, то результат and then такой же, как and, а результат or else — как or.

Примечание. Обычный смысл логических операций задается таблицей истинности (см. табл. 4.2).

Таблица 4.2

А

В

A and В

A or В

A xor В

TRUE

TRUE

TRUE

TRUE

FALSE

TRUE

FALSE

FALSE

TRUE

TRUE

FALSE

TRUE

FALSE

TRUE

TRUE

FALSE

FALSE

FALSE

FALSE

FALSE

Примеры логических операций:

СОЛНЦЕ or ТЕПЛО

ФИЛЬТР (1. .10) and ФИЛЬТР (15. .24) - - см. 3.6.1

Примеры форм управления с промежуточной проверкой:

СЛЕДУЮЩИЙАВТО.ВЛАДЕЛЕЦ/ = null and then

СЛЕДУЮЩИЙАВТО.ВЛАДЕЛЕЦ.ВОЗРАСТ > 25 - - см. 3.8.1

К = 0 or else А (К) = ВЕРХ_ЗНАЧЕНИЕ

  1. О п е р а ц и и отношения и проверки принадлеж­ности

Операции равенство и неравенство предопределены для любого, не яв­ляющегося лимитируемым, типа. Остальные операции отношения являются операциями упорядочивания: < (меньше), <= (меньше или равно), > (боль­ше), >= (больше или равно). Все эти операции сведены в табл. 4.3. Опера­ции упорядочивания предопределены для любого скалярного типа и любого дискретного индексируемого типа (одномерного индексируемого типа с компонентами дискретного типа). Операнды каждой предопределенной операции отношения имеют один и тот же тип.Тип результата—предопреде­ленный тип BOOLEAN.

Смысл операций отношения традиционный: результат равен TRUE, если соответствующее отношение удовлетворено, результат равен FALSE в про­тивном случае. Операция неравенства дает результат противоположный ре­зультату операции равенства: FALSE, если операнды равны, TRUE, если — не равны.

Таблица 4.3

Знак операции

Операция

Тип операнда

Тип результата

= / =

Равенство и нера­венство

Проверка упоря­доченности

Любой тип

Любой скалярный тип

Дискретный индек­сируемый тип

BOOLEAN

BOOLEAN

BOOLEAN



Равенство для дискретных типов — это равенство значений. Результаты предопределенных операций отношения для вещественных операндов, зна­чения которых равны приблизительно, приводятся в разд. 4.5.7. Два ссы­лочных значения равны, когда они указывают на один и тот же объект, ли­бо когда они равны пустому значению ссылочного типа.

Для двух значений одного и того же индексируемого типа или имену­емого типа левый операнд равен правому, если и только если для каждого компонента левого операнда имеется сопоставленный компонент правого операнда, и наоборот; значения сопоставленных компонентов равны в смыс­ле предопределенной операции равенства для типа этих компонентов. В частности, всегда равны два пустых массива одного и того же типа, всегда равны две пустых записи одного и того же типа.

Для сравнения двух записей одинакового типа сопоставленными ком­понентами являются компоненты (если они есть) с одинаковыми иденти­фикаторами компонентов.

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

Если равенство явно определено для лимитируемого типа, оно не рас­пространяется на составные типы, имеющие подкомпоненты лимитируемо­го типа (допускается явное определение равенства для таких составных ти­пов) .

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

Проверки принадлежности in и not in предопределены для всех типов. Типом результата является предопределенный тип BOOLEAN. Для провер­ки принадлежности диапазону простое выражение и границы диапазона должны быть одного и того же скалярного типа; для проверки принадлеж­ности с обозначением типа тип простого выражения должен быть базовым для этого обозначения. Вычисление проверок принадлежности, in выраба­тывает результат TRUE, если значение простого выражения принадлежит данному диапазону или это значение принадлежит подтипу, заданному обо­значением типа; в противном случае вычисление вырабатывает результат FALSE (для значений вещественного типа см. 4.5.7). Проверка принадлеж­ности not in вырабатывает результат, противоположный результату провер­ки принадлежности in.

Примеры:

X/= Y

””<”А” and ”А” < ”АА” --TRUE

”АА” < "В” and ”А” < ”А” - - TRUE

МОЙ_АВТО = null - - истина, если МОЙ_АВТО пуст (см. 3.8.1)

МОЙ_АВТО = В АШ_АВТО - - истина, если используется один и тот же автомобиль МОЙАВТО. all = ВАШ_АВТО. all - - истина, если оба автомобиля идентичны К not in 1. .10 - - проверка принадлежности диапазону

СЕГОДНЯ in ПНД. .ПТН - - проверка принадлежности диапазону

СЕГОДНЯ in ДЕНЬНЕДЕЛИ - - проверка принадлежности подтипу (см. 3.5.1)

АРХИВ in УСТРОЙСТВО-ДИСКА - - проверка принадлежности подтипу (см. 3.7.3)

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

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


  1. Б и н а р н ы е аддитивные операции

Б

массивы, то результатом катенации

инарные аддитивные операции + и — предопределены для любого чис­лового типа и имеют свой обычный смысл. Операция катенации & предопре­делена для любого одномерного нелимитируемого индексируемого типа. Характеристики операций сведены в табл. 4.4.

Знак операции

Операция

Тип левого операн­да

Тип правого опе­ранда

Тип результата

+

Сложение

Любой числовой тип

Тот же числовой тип

Тот же числовой тип

Вычитание

Любой числовой тип

Тот же числовой тип

Тот же числовой тип

&

Катенация

Любой индексируе­мый тип

Любой индексируе­мый тип Тип компонента

Тип компонента

Тот же индексиру­емый тип Тип компонента

Любой индексиру­емый тип Тип компонента

Тот же индексиру­емый тип

Тот же индексиру­емый тип

Тот же индексиру­емый тип

Любой индексиру­емый тип

Таблица 4.4


результата определяется типом опе-


Для вещественных типов точность рандов (см. 4.5.7).

Если оба операнда — одномерные



является одномерный массив, длина которого равна сумме длин операндов, а его компоненты составлены из компонентов левого операнда и следую­щих за ними компонентов правого операнда. Нижняя граница этого резуль­тата совпадает с нижней границей левого операнда, если левый операнд — не пустой массив; в противном случае результатом катенации является пра­вый операнд.

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

О

Примеры: Х + 0.1 ”А” & ”БВГ 'А' & ”БВГ” 'А' & 'А'

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