Справочное руководство Ada 2012
4.5 Операторы и оценка выражений
Язык определяет следующие шесть категорий операторов (в порядке возрастания приоритета). Соответствующие operator_symbol, и только они, могут использоваться в качестве designator в объявлениях функций для пользовательских операторов. См. 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 только в случае, если результат находится вне безопасного диапазона типа результата.
Разрешения для реализации
Для последовательности предопределённых операторов одного уровня приоритета (и в отсутствие скобок, навязывающих специфическую ассоциацию), реализация может навязать любую ассоциацию операторов с операндами, при условии, что полученный результат является допустимым результатом для ассоциации слева направо, но игнорируя потенциальную возможность сбоя языковых проверок как в левосторонней, так и в выбранной последовательности ассоциаций.
ПРИМЕЧАНИЯ
12 Два операнда выражения вида 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