Справочник Ada 95
4.5 Операторы и вычисление выражений
Язык определяет следующие шесть категорий операторов (приведенные в порядке возрастания приоритета). Соответствующие operator_symbols, и только они, могут использоваться в качестве designators в объявлениях функций для пользовательских операторов. См. 6.6, ``Перегрузка операторов''.
Синтаксис
logical_operator ::= and | or | xor
relational_operator ::= = | /= | < | <= | > | >=
binary_adding_operator ::= + | - | &
unary_adding_operator ::= + | -
multiplying_operator ::= * | / | mod | rem
highest_precedence_operator ::= ** | abs | not
Статическая семантика
Для последовательности операторов одного уровня приоритета операторы связываются со своими операндами в текстовом порядке слева направо. Скобки могут использоваться для навязывания конкретных связей.
Для каждой формы определения типа определенные из вышеперечисленных операторов являются предопределенными; то есть, они неявно объявляются сразу после определения типа. Для каждого такого неявного объявления оператора параметры называются Left и Right для бинарных операторов; единственный параметр называется Right для унарных операторов. Выражение вида X op Y, где op — бинарный оператор, эквивалентно вызову функции вида "op"(X, Y). Выражение вида op Y, где op — унарный оператор, эквивалентно вызову функции вида "op"(Y). Предопределенные операторы и их эффекты описаны в подразделах 4.5.1 по 4.5.6.
Динамическая семантика
Предопределенные операции над целочисленными типами либо дают математически правильный результат, либо генерируют исключение Constraint_Error. Для реализаций, поддерживающих Приложение к Numerics, предопределенные операции над вещественными типами дают результаты, точность которых определена в Приложении G, или генерируют исключение Constraint_Error.
Требования к реализации
Реализация предопределенного оператора, возвращающего результат целочисленного или фиксированного типа, может генерировать Constraint_Error только если результат находится вне базового диапазона типа результата.
Реализация предопределенного оператора, возвращающего результат с плавающей запятой, может генерировать Constraint_Error только если результат находится вне безопасного диапазона типа результата.
Разрешения реализации
Для последовательности предопределенных операторов одного уровня приоритета (и при отсутствии скобок, навязывающих определённую ассоциативность), реализация может навязать любую ассоциацию операторов с операндами, при условии, что полученный результат является допустимым результатом для ассоциативности слева направо, но игнорируя возможные сбои проверок, определённых языком, как в ассоциативности слева направо, так и в выбранном порядке ассоциативности.
ПРИМЕЧАНИЯ
11 Два операнда выражения вида X op Y, где op — бинарный оператор, вычисляются в произвольном порядке, как и для любого function_call (см. 6.4).
Примеры
Примеры приоритета:
not Sunny or Warm -- то же самое, что (not Sunny) or Warm
X > 4.0 and Y > 0.0 -- то же самое, что (X > 4.0) and (Y > 0.0)
X > 4.0 and Y > 0.0 -- то же самое, что (X > 4.0) and (Y > 0.0)
-4.0*A**2 -- то же самое, что -(4.0 * (A**2))
abs(1 + A) + B -- то же самое, что (abs (1 + A)) + B
Y**(-3) -- скобки необходимы
A / B * C -- то же самое, что (A/B)*C
A + (B + C) -- вычислить B + C перед добавлением к A
abs(1 + A) + B -- то же самое, что (abs (1 + A)) + B
Y**(-3) -- скобки необходимы
A / B * C -- то же самое, что (A/B)*C
A + (B + C) -- вычислить B + C перед добавлением к A