Операции и вычисление выражения
В языке определяется шесть классов операций. При описании функций, определяющих пользовательские операции, 6 качестве обозначений могут быть использованы приведенные ниже знаки операций (исключая /=). Шесть классов операций приведены в порядке возрастания их старшинства.
логическая-операция ::= and | ог | xor операция-отношения ::= = | /= | <|<=|>|>= бинарная-аддитивная-операция ::= + | - | & унарная-аддитивная-операция ::= + | - мультипликативная-операция ::= * | / | mod | геm операция-высшего-приоритета ::= ** | abs | лоt
Формы управления промежуточной проверкой and then и ог else имеют тот же порядок старшинства, что и логические операции. Проверки принадлежности in и not in имеют то же старшинство, что и операции отношения.
В слагаемом, простом выражении, отношении или выражении группирование операций с их операндами проводится сначала для операций с большим старшинством, а затем для операций с меньшим старшинством. В случае последовательных операций с одинаковым старшинством группирование операций с их операндами производится в порядке их текстуального следования слева направо; для изменения порядка группирования могут использоваться скобки.
В языке не определяется порядок вычисления операндов множителя, слагаемого, простого выражения или отношения и операндов выражения, которое не содержит форм управленияпромежуточной проверки (но вычисление производится до применения соответствующей операции). Правый операнд формы управления промежуточной проверкой вычисляется тогда и только тогда, когда левый операнд имеет определенное значение (см. 1).
Для каждой формы описания типа некоторые из перечисленных операций являются предопределенными, т. е. неявно вводятся описанием типа. Для каждого такого неявного описания операции именами параметров являются LEFT и RIGHT для бинарных операций; для унарных аддитивных операций и унарных операций abs и not их единственный параметр именуется RIGHT. В разд. 1 — 7 поясняются результаты предопределенных операций.
Предопределенные операции над целыми типами либо вырабатывают математически корректный результат, либо возбуждают исключение NUMERIC_ERROR. Предопределенная операция, вырабатывающая результат целого типа (отличного от универсального-целого ) , может возбуждать исключение NUMERIC_ERROR, только если математический результат не является значением этого целого типа. Предопределенные операции над вещественными типами вырабатывают результаты, точность которых определяется в разд. 7. Предопределенная операция, вырабатывающая результат вещественного типа (отличного от универсального-вещественного ) , может возбуждать исключение NUMERIC_ERROR, только если ее результат не принадлежит диапазону хранимых чисел этого типа, как это поясняется в разд. 7.
Примеры старшинства:
not SUNNY or WARM -- совпадает с (not SUNNY) or WARM Х > 4.0 and Y > 0.0 -- совпадает с (X > 4.0) and (Y > 0.0) -4.0 * А ** 2 -- совпадает с -(4.0 * (А ** 2)) abs (1 + А) + В -- совпадает с (abs (1 + А)) + В Y ** (-3) -- скобки необходимы А/В * С -- совпадает с (А/В) * С А + (В + С) -- вычисляется В + С, а затем к результату -- прибавляется АСсылки: вещественный тип 6, в некотором порядке 1.6, возбуждение исключения 11, выражение 4.4, диапазон 3.5, имя 4.1, исключение NUMERIC-ERROR 11.1, множитель 4.4, неявное описание 3.1, обозначение 6.1, описание типа 1, отношение 4.4, проверка вхождения 2, простое выражение 4.4, слагаемое-4.4, совмещение 6.6, 8.7, тип 3.3, универсальный-вещественный тип 6, универсальный-целый тип 4, форма управления промежуточной проверкой 4.5, 1, хранимое число 6, целый тип 4.
1. ЛОГИЧЕСКИЕ ОПЕРАЦИИ И ФОРМЫ УПРАВЛЕНИЯ ПРОМЕЖУТОЧНОЙ ПРОВЕРКОЙ
Приводимые ниже логические операции предопределены для логических типов и одномерных индексируемых типов с компонентами логического типа. В обоих случаях операнды должны иметь один и тот же тип.
Знак операции | Операция | Тип операнда | Тип результата |
and | Конъюнкция | Любой логический тип Массив логических компонент | Тот же логический тип Тот же индексируемый тип |
ог | Дизъюнкция | Любой логический тип Массив логических компонент | Тот же логический тип Тот же индексируемый
тип |
хог | Исключающая дизъюнкция | Любой логический
ТИП Массив логических компонент |
Тот же логический
Тот же индексируемый тип |
Операции над массивами выполняются покомпонентно, если компоненты имеются (как для равенства, см. 2). Границы массива-результата совпадают с границами левого операнда. Для каждой компоненты левого операнда проверяется наличие соответствующей компоненты правого операнда, и наоборот. При нарушении соответствия компонент возбуждается исключение CONSTRAINT_ERROR.
Формы управления промежуточной проверкой and then и or else определены для двух операндов логического типа и вырабатывают результат того же самого типа. Левый операнд формы управления промежуточной проверкой всегда вычисляется первым. Если левый операнд выражения с формой and then дает значение FALSE, то правый операнд не вычисляется и значением выражения является FALSE. Если левый операнд с формой or else дает TRUE то правый операнд не вычисляется и значением выражения является TRUE. Если вычисляют ся оба операнда, то результат and then такой же, как and, а результат or else — как ог.
Примечание. Обычный смысл логических операций задается следующей таблицей истинности:
А | В | A and B | A or B | A xor B |
TRUE | TRUE | TRUE | TRUE | FALSE |
TRUE | FALSE | FALSE | TRUE | TRUE |
FALSE | TRUE | FALSE | TRUE | TRUE |
FALSE | FALSE | FALSE | FALSE | FALSE |
Примеры логических операций:
SUNNY or WARM FILTER(1 .. 10) and FILTER(15 .. 24) -- см. 1Примеры форм управления с промежуточной проверкой:
NEXT_CAR.OWNER /= null and then NEXT_CAR.OWNER.AGE > 25 N = 0 or else A(N) = HIT_VALUE -- см. 1Ссыпки: возбуждение исключений 11, граница диапазона индекса 1, индексируемый тип 3.6, исключение CONSTRAINT_ERROR 11.1, компонента массива 3.6, логический тип 3, логическое значение FALSE 3, логическое значение TRUE 3, операция 4.5, операция типа 3.3, подтип индекса 3.6, предопределенная операция 4.5, пустой массив 1, размерность 3.6, сопоставимые компоненты массивов 2, тип
2. ОПЕРАЦИИ ОТНОШЕНИЯ И ПРОВЕРКИ ПРИНАДЛЕЖНОСТИ
Операции равенство и неравенство предопределены для любого типа, не являющегося лимитируемым. Остальные операции отношения являются операциями упорядочивания:< (меньше), < = (меньше или равно), > (больше), > = (больше или равно). Операции упорядочивания предопределены для любого скалярного типа и любого дискретного индексируемого типа (одномерного индексируемого типа с компонентами дискретного типа). Операнды каждой предопределенной операции отношения имеют один и тот же тип. Тип результата — предопределенный тип — BOOLEAN.
Смысл операций отношения традиционный: результат равен TRUE, если соответствующее отношение удовлетворено, результат равен FALSE в противном случае. Операция нер-зенства дает результат, противоположный результату операции равенства: FALSE, если операнды равны; TRUE — если не равны.
Знак операции | Операция | Тип операнда | Тип результата |
= /= | Равенство и неравенство | Любой тип | BOOLEAN |
< < = > > = | Проверка упорядоченности | Любой скалярный
ТИП |
BOOLEAN |
Дискретный индексируемый ТИП | BOOLEAN |
Равенство для дискретных типов — это равенство значений. Результаты предопределенных операций отношения для вещественных операндов, значения которых равны приблизительно, приводятся в разд. 7. Два ссылочных значения равны, когда они указывают на один и тот же объект либо когда они равны пустому значению ссылочного типа.
Для двух значений одного и того же индексируемого типа или именуемого типа левый операнд равен правому, если и только если для каждой компоненты левого операнда имеется сопоставленная компонента правого операнда, и наоборот; значения сопоставленных компонент равны в смысле предопределенной операции равенства для типа этих компонент. В частности, всегда равны два пустых массива одного и того же типа, всегда равны две пустые записи одного и того же типа.
Для сравнения двух записей одинакового типа сопоставленными компонентами являются компоненты [5] с одинаковыми идентификаторами компонент.
При сравнении двух одномерных массивов одинакового типа сопоставленными являются компоненты (если они есть), значения индексов которых сопоставляются друг с другом следующим образом: сопоставляются нижние границы диапазонов индексов друг с другом, следующие за сопоставленными индексами также сопоставляются. При сравнении двух многомерных массивов сопоставленными являются компоненты, у которых значения индексов сопоставлены в порядке позиций индексов.
Если равенство явно определено для лимитируемого типа, оно не распространяется на составные типы, имеющие подкомпоненты лимитируемого типа (допускается явное определение равенства для таких составных типов).
Операции упорядочивания <, <= , > и >=, которые определены для дискретных индексируемых типов, соответствуют лексикографическому порядку, основанному на предопределенном отношении порядка для типов компонент. Пустой массив лексикографически меньше массива, имеющего по крайней мере одну компоненту. Для непустых массивов левый операнд лексикографически меньше правого операнда, если первая компонента левого операнда меньше первой компоненты правого операнда или если их первые компоненты равны, а хвост левого операнда лексикографически меньше правого (хвост состоит из оставшихся компонент, исключая первую, и может быть пустым).
Проверки принадлежности in и not in предопределены для всех типов. Типом результата является предопределенный тип BOOLEAN. Для проверки принадлежности диапазону простое выражение и границы диапазона должны быть одного и того же скалярного типа; для проверки принадлежности с обозначением типа тип простого выражения должен быть базовым для этого обозначения. Вычисление проверок принадлежности in вырабатывает результат TRUE, если значение простого выражения принадлежит данному диапазону или это значение принадлежит подтипу, заданному обозначением типа; в противном случае вычисление вырабатывает результат FALSE (для значений вещественного типа см. 7). Проверка принадлежности not in вырабатывает результат, противоположный результату проверки принадлежности in.