Предопределенный логический тип Boolean
В Аде, предопределенный логический тип Boolean описывается как перечислимый тип в пакете Standard:
type Boolean is (False, True); |
Таким образом, переменные логического типа Boolean могут принимать только одно из двух значений: True (истина) или False (ложь).
Примечательно, что предопределеннный логический тип Boolean имеет специальное предназначение. Значения этого типа используются в условных инструкциях языка Ада ("if ... ", "exit when ... ", ...). Это подразумевает, что если вы пытаетесь описать свой собственный логический тип Boolean, и описываете его точно также как и предопределенный тип Boolean (полное имя предопределенного логического типа - Standard.Boolean), то вы получаете абсолютно самостоятельный тип(!). В результате, вы не можете использовать значения, описанного вами типа Boolean, в условных инструкциях языка Ада, которые ожидают только тип Standard.Boolean.
Значения предопределенного логического типа Standard.Boolean
возвращают знаки операций сравнения:
= -- равно /= -- не равно < -- меньше <= -- меньше или равно > -- больше >= -- больше или равно |
Для обработки значений типа Boolean могут быть использованы следующие знаки операций:
and -- логическое И: вычисляются и левая, и правая часть выражения and then -- логическое И: правая часть выражения вычисляется, если -- результат вычисления левой части - True
or -- логическое ИЛИ: вычисляются и левая, и правая часть выражения or else -- логическое ИЛИ: правая часть выражения вычисляется, если -- результат вычисления левой части - False xor -- исключающее ИЛИ not -- отрицание (инверсия); унарная операция |
Обычно, при вычислении значений логических выражений, компилятор сам определяет последовательность вычисления каждого логического значения. При этом, производится вычисление всех логических переменных, указанных в логическом выражении.
Тем кто знаком с языком Паскаль следует заметить, что такой подход отличается от правил принятых в современных диалектах Паскаля, где, для повышения производительности, определение значения результата всего логического выражения может быть выполнено сокращенно, в зависимости от предварительных результатов обработки выражения.
Например, при определении значения результата следующего логического выражения
(B /= 0) and (A/B > 0) |
Чтобы избежать подобных ошибок, а также в целях увеличения производительности, необходимо производить вычисление значений логических переменных в определенной последовательности и прекращать ее как только результат всего выражения уже определен. Для этого можно использовать "and then" вместо "and", и "or else" вместо "else", указывая порядок обработки логического выражения явно:
(B /= 0) and then (A/B > 0) |
Можно переписать предыдущий пример с использованием "or else". Тогда, обработка логического выражения будет завершена в случае если значение слева от "or else" вычислено как True:
(B = 0) or else (A/B |
(A < B) and (B > C) or (D < E) -- запрещено ((A < B) and (B > C)) or (D < E) -- разрешено |