Spec-Zone.ru › Ada 95
Справочник Ada 95

4.5.2 Операторы отношения и проверки принадлежности

Операторы равенства = (равно) и /= (не равно) определены для не ограниченных типов. Другие relational_operatorы — это операторы упорядочения < (меньше), <= (меньше или равно), > (больше) и >= (больше или равно). Операторы упорядочения определены для скалярных типов и для дискретных типов массивов, то есть одномерных массивов, компоненты которых имеют дискретный тип.
Проверка принадлежности, используя in или not in, определяет, принадлежит ли значение заданному подтипу или диапазону или имеет тег, который идентифицирует тип, покрываемый данным типом. Проверки принадлежности разрешены для всех типов.

Правила разрешения имен

Проверяемый тип в проверке принадлежности — это тип диапазона или тип, определяемый subtype_mark. Если проверяемый тип помечен, то simple_expression должен разрешиться как тип, покрывающий или покрываемый проверяемым типом; если непомечен, ожидаемый тип для simple_expression — это проверяемый тип.

Правила легальности

Для проверки принадлежности, если simple_expression имеет тип метки класса, тогда проверяемый тип должен быть (видимо) помеченным.

Статическая семантика

Тип результата проверки принадлежности — предопределенный тип Boolean.
Операторы равенства предопределены для каждого конкретного типа T, который не ограничен и не является анонимным типом доступа, со следующими спецификациями:
function "=" (Left, Right : T) return Boolean
function "/="(Left, Right : T) return Boolean
Операторы упорядочения предопределены для каждого конкретного скалярного типа T и для каждого дискретного массива типа T со следующими спецификациями:
function "<" (Left, Right : T) return Boolean
function "<="(Left, Right : T) return Boolean
function ">" (Left, Right : T) return Boolean
function ">="(Left, Right : T) return Boolean

Динамическая семантика

Для дискретных типов предопределённые операторы отношения определяются через соответствующие математические операции над позиционными номерами значений операндов.
Для вещественных типов предопределённые операторы отношения определяются через соответствующие математические операции над значениями операндов, с учётом точности типа.
Два значения доступа к объекту равны, если они обозначают один и тот же объект или если оба равны нулевому значению типа доступа.
Два значения доступа к подпрограмме равны, если они являются результатом одного и того же вычисления атрибута доступа attribute_reference, или если оба равны нулевому значению типа доступа. Два значения доступа к подпрограмме не равны, если они обозначают разные подпрограммы. Не определено, равны ли или не равны два значения доступа, которые обозначают одну и ту же подпрограмму, но являются результатом различных вычислений атрибута доступа attribute_reference.
Для расширения типа предопределённое равенство определяется через примитивный (возможно, определяемый пользователем) оператор равенства родительского типа и любых помеченных компонентов части расширения, а также через предопределённое равенство для любых других компонентов, не унаследованных от родительского типа.
Для частного типа, если его полный тип помечен, предопределённое равенство определяется через примитивный оператор равенства полного типа; если полный тип не помечен, предопределённое равенство для частного типа — это равенство его полного типа.
Для других составных типов предопределенные операторы равенства (и некоторые другие предопределенные операции над составными типами — см. 4.5.1 и 4.6) определяются через соответствующую операцию над соответствующими компонентами, определяемыми следующим образом:
  • Для двух составных объектов или значений одного и того же не массивно-типового типа соответствующие компоненты — это те, которые соответствуют одной и той же component_declaration или discriminant_specification;
  • Для двух одномерных массивов одного типа соответствующие компоненты — это те (если таковые имеются), значения индексов которых соответствуют следующим образом: нижние границы диапазонов индексов определены как соответствующие, а преемники соответствующих индексов определены как соответствующие;
  • Для двух многомерных массивов одного типа соответствующие компоненты — это те, значения индексов которых соответствуют в последовательных позициях индексов.
Аналогичные определения применяются, если типы двух объектов или значений являются преобразуемыми, а не одинаковыми.
Учитывая приведенное выше определение соответствующих компонентов, результат предопределённого оператора равенства для составных типов (кроме тех, которые были рассмотрены ранее) определяется следующим образом:
  • Если нет компонентов, результат определяется как True;
  • Если есть несоответствующие компоненты, результат определяется как False;
  • В противном случае результат определяется через примитивный оператор равенства для любых соответствующих помеченных компонентов и предопределенное равенство для любых соответствующих непомеченных компонентов.
Для любого составного типа порядок, в котором вызывается «=» для компонентов, не определён. Кроме того, если результат может быть определён до вызова «=» для некоторых компонентов, не определено, вызывается ли «=» для этих компонентов.
Предопределённый оператор «/==» даёт результат, обратный предопределённому оператору «==».
Для дискретного массива типа предопределённые операторы упорядочения соответствуют лексикографическому порядку с использованием предопределённого отношения порядка типа компонента: Нулевой массив лексикографически меньше любого массива, имеющего хотя бы один компонент. В случае непустых массивов левый операнд лексикографически меньше правого операнда, если первый компонент левого операнда меньше, чем правого; в противном случае левый операнд лексикографически меньше правого операнда только в том случае, если их первые компоненты равны, а хвост левого операнда лексикографически меньше хвоста правого (хвост состоит из оставшихся компонентов, кроме первого, и может быть пустым).
При вычислении проверки принадлежности simple_expression и диапазон (если таковой имеется) вычисляются в произвольном порядке.
Проверка принадлежности, использующая in, даёт результат True, если:
  • Проверяемый тип — скалярный, и значение simple_expression принадлежит заданному диапазону или диапазону именованного подтипа; или
  • Проверяемый тип — не скалярный, и значение simple_expression удовлетворяет любым ограничениям именованного подтипа, и, если тип simple_expression — метки класса, значение имеет тег, идентифицирующий тип, покрываемый проверяемым типом.
В противном случае тест даёт результат False.
Проверка принадлежности, использующая not in, даёт результат, обратный соответствующей проверке принадлежности с использованием in.

Требования к реализации

Для всех не ограниченных типов, объявленных в пакетах, определяемых языком, операторы «=» и «/==» типа должны вести себя так, как если бы они были предопределёнными операторами равенства для целей равенства составных типов и формальных типов обобщения.
ПРИМЕЧАНИЯ
13 Исключение никогда не возникает при проверке принадлежности, предопределенном операторе упорядочения или предопределенном операторе равенства для элементарного типа, но исключение может возникнуть при вычислении операндов. Предопределённый оператор равенства для составного типа может вызывать исключение только если тип имеет помеченную часть, чей примитивный оператор равенства распространяет исключение.
14 Если составной тип имеет компоненты, зависящие от дискриминантов, два значения этого типа имеют соответствующие компоненты тогда и только тогда, когда их дискриминанты равны. Два непустых массива имеют соответствующие компоненты тогда и только тогда, когда длина каждого измерения одинакова для обоих.

Примеры

Примеры выражений, включающих операторы отношения и проверки принадлежности:
X /= Y
"" < "A" and "A" < "Aa" -- True
"Aa" < "B" and "A" < "A " -- True
My_Car = null -- true, если My_Car было установлено в null (см. 3.10.1)
My_Car = Your_Car -- true, если у нас одна и та же машина
My_Car.all = Your_Car.all -- true, если две машины идентичны
N not in 1 .. 10 -- проверка принадлежности диапазону
Today in Mon .. Fri -- проверка принадлежности диапазону
Today in Weekday -- проверка принадлежности подтипу (см. 3.5.1)
Archive in Disk_Unit -- проверка принадлежности подтипу (см. 3.8.1)
Tree.all in Addition'Class -- проверка принадлежности классу (см. 3.9.1)


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API