Справочник по Ada 2005
4.5 Операторы и оценка выражений
Язык определяет следующие шесть категорий операторов (в порядке возрастания приоритета). Соответствующие символы_операторов, и только они, могут использоваться в качестве идентификаторов в объявлениях функций для пользовательских операторов. См. 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. Для реализаций, поддерживающих приложение «Числа», предопределённые операции над вещественными типами возвращают результаты, точность которых определена в Приложении 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