Справочник Ada 2012
4.5.1 Логические операторы и формы управления короткого замыкания
Правила разрешения имен
Выражение, состоящее из двух отношений, соединенных операторами and then или or else (форма управления короткого замыкания), должно иметь тип булевого значения; ожидаемый тип для обоих отношений — тот же булев тип.
Статическая семантика
Следующие логические операторы определены для каждого булевого типа T, для каждого модульного типа T и для каждого одномерного массива типа T, тип компонента которого — булев тип:
function "and"(Left, Right : T) return T
function "or" (Left, Right : T) return T
function "xor"(Left, Right : T) return T
function "or" (Left, Right : T) return T
function "xor"(Left, Right : T) return T
Для булевых типов предопределенные логические операторы and, or и xor выполняют соответственно операции конъюнкции, включительно-дизъюнкции и исключающей дизъюнкции.
Для модульных типов предопределенные логические операторы определены на основе поразрядных операций, используя двоичное представление значений операндов для получения двоичного представления результата, где ноль представляет False, а единица — True. Если этот результат выходит за пределы базового диапазона типа, выполняется окончательное вычитание модуля, чтобы привести результат в базовый диапазон типа.
Логические операторы над массивами выполняются покомпонентно для соответствующих компонентов (как для равенства — см. 4.5.2), используя предопределенный логический оператор для типа компонента. Границы результирующего массива — те же, что и у левого операнда.
Динамическая семантика
Формы управления короткого замыкания and then и or else дают тот же результат, что и соответствующие предопределенные операторы and и or для булевых типов, за исключением того, что левый операнд всегда оценивается первым, а правый операнд не оценивается, если значение левого операнда определяет результат.
Для логических операторов над массивами проверяется, что для каждого компонента левого операнда существует соответствующий компонент правого операнда и наоборот. Также проверяется, что каждый компонент результата принадлежит типу компонента. Если хотя бы одно из этих условий не выполняется, генерируется исключение Constraint_Error.
ПРИМЕЧАНИЯ
13 Обычное значение логических операторов задается следующей таблицей истинности:
A B (A and B) (A or B) (A xor B)
True True True True False
True False False True True
False True False True True
False False False False False
True True True True False
True False False True True
False True False True True
False False False False False
Примеры
Примеры логических операторов:
Sunny or Warm
Filter(1 .. 10) and Filter(15 .. 24) -- см. 3.6.1
Filter(1 .. 10) and Filter(15 .. 24) -- см. 3.6.1
Примеры форм управления короткого замыкания:
Next_Car.Owner /= null and then Next_Car.Owner.Age > 25 -- см. 3.10.1
N = 0 or else A(N) = Hit_Value
N = 0 or else A(N) = Hit_Value