В языке определены шесть классов операций. При описании функций, определяющих пользовательские операции, в качестве обозначений могут быть использованы приведенные ниже знаки операции (исключая / =). Шесть классов операций приведены в порядке возрастания их старшинства.
логическая_операция : : = and or xor
операция_отношения : : = = / = < <= > > =
бинарная_аддитивная_операция : : = + - &
унарная_аддитивная_операция : : = + -
мультипликативная_операция : : = * / mod rem
операция_высшего_приоритета : := ** abs not
Формы управления с промежуточной проверкой and then и or else имеют тот же порядок старшинства, что и логические операции. Проверки принадлежности in и not in имеют то же старшинство, что и операции отношения.
В слагаемом, простом выражении, отношении или выражении, группирование операций с их операндами проводится сначала для операций с большим старшинством, а затем для операций с меньшим старшинством. В случае последовательных операций с одинаковым старшинством группирование операций с их операндами производится в порядке их текстуального следования слева направо; для изменения порядка группирования могут использоваться скобки.
В языке не определяется порядок вычисления операндов множителя, слагаемого, простого выражения или отношения и операндов выражения, которое не содержит форм управления с промежуточной проверкой (но вычисление операндов производится до применения соответствующей операции). Правый операнд формы управления с промежуточной проверкой вычисляется тогда и только тогда, когда левый операнд имеет определенное значение (см. 4.5.1).
Для каждой формы описания типа некоторые из перечисленных операций являются предопределенными, т.е. неявно задаются описанием типа. Для каждого такого неявного описания операции именами параметров являются LEFT и RIGHT для бинарных операций; для унарных аддитивных операций и унарных операций abs и not их единственный параметр именуется RIGHT. В разд.4.5.1-4.5.7 поясняются результаты предопределенных операций.
Предопределенные операции над целыми типами либо вырабатывают математически корректный результат, либо возбуждают исключение NUMERIC_ERROR. Предопределенная операция, вырабатывающая результат целого типа (отличного от универсального_целого), может лишь возбуждать исключение NUMERIC_ERROR, только если математический результат не является значением этого целого типа. Предопределенные операции над вещественными типами вырабатывают результаты, точность которых определяется в соответствии с разд.4.5.7. Предопределенная операция, вырабатывающая результат вещественного типа (отличного от универсального_вещественного), может возбуждать исключение NUMERIC_ERROR, только если ее результат не принадлежит диапазону хранимых чисел этого типа, как это поясняется в разд.4.5.7.
Примеры старшинства
not СОЛНЦЕ or ТЕПЛО | - - совпадает с (not СОЛНЦЕ) or ТЕПЛО | |||
Х > 4.0 and Y > 0.0 | - - совпадает с (X > 4.0) and (Y > 0.0) | |||
-4.0 * A ** 2 | - - совпадает с - (4.0 * (А ** 2)) | |||
abs (1 + A) + B | - - совпадает с (abs (1 + А)) + В | |||
Y ** (-3) | - - скобки необходимы | |||
А/В * С | - - совпадает с (А/В) * С | |||
А + (В + С) | - - вычисляется В + С, а затем к результату прибавляется А |
4.5.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 |