логическая_операция : : = 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 + А)) + В
- скобки необходимы
- совпадает с (А/В) » С
- вычисляется В + С, а затем к результату прибавляется А
Л о г и ч е с к и е операции и формы управления с промеж уточной проверкой
Приводимые в табл. 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 А (К) = ВЕРХ_ЗНАЧЕНИЕ
О п е р а ц и и отношения и проверки принадлежности
Операции равенство и неравенство предопределены для любого, не являющегося лимитируемым, типа. Остальные операции отношения являются операциями упорядочивания: < (меньше), <= (меньше или равно), > (больше), >= (больше или равно). Все эти операции сведены в табл. 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 (К) для каждой позиции индекса одинаковы у обоих массивов.
Б и н а р н ы е аддитивные операции
Б
массивы, то результатом катенации
инарные аддитивные операции + и — предопределены для любого числового типа и имеют свой обычный смысл. Операция катенации & предопределена для любого одномерного нелимитируемого индексируемого типа. Характеристики операций сведены в табл. 4.4.
Знак операции |
Операция |
Тип левого операнда |
Тип правого операнда |
Тип результата |
+ |
Сложение |
Любой числовой тип |
Тот же числовой тип |
Тот же числовой тип |
— |
Вычитание |
Любой числовой тип |
Тот же числовой тип |
Тот же числовой тип |
& |
Катенация |
Любой индексируемый тип Любой индексируемый тип Тип компонента Тип компонента |
Тот же индексируемый тип Тип компонента Любой индексируемый тип Тип компонента |
Тот же индексируемый тип Тот же индексируемый тип Тот же индексируемый тип Любой индексируемый тип |
Таблица 4.4
результата определяется типом опе-
Для вещественных типов точность рандов (см. 4.5.7).
Если оба операнда — одномерные
является одномерный массив, длина которого равна сумме длин операндов, а его компоненты составлены из компонентов левого операнда и следующих за ними компонентов правого операнда. Нижняя граница этого результата совпадает с нижней границей левого операнда, если левый операнд — не пустой массив; в противном случае результатом катенации является правый операнд.
Если любой из операндов имеет тип компонента индексируемого типа, то результат катенации определяется по приведенным выше правилам, где вместо соответствующего операнда используется массив, имеющий этот операнд в качестве своего единственного компонента, и с нижней границей, совпадающей с нижней границей подтипа индекса.
О
Примеры: Х + 0.1 ”А” & ”БВГ 'А' & ”БВГ” 'А' & 'А'
перацией катенации возбуждается исключение CONSTRA1NT_ERROR, если верхняя граница результата выходит за диапазон подтипа индекса, кроме того случая, когда результат — пустой массив, а также если какой-либо операнд, тип которого есть тип компонента, имеет значение, не принадлежащее данному подтипу компонента.