Axiom Справочник языка

02 · Переменные и значения

Логический тип BOOLEAN

Проверка условий, сравнение значений и логические связки дают результат, у которого есть только два состояния: истина и ложь. Эти состояния записываются литералами TRUE и FALSE и относятся к типу BOOLEAN, по которому IF, WHILE и DO решают, выполнять ли ветвь или продолжать цикл.

Литералы, регистр и начальное значение

Литерал TRUE обозначает истину, литерал FALSE — ложь. Оба имеют тип BOOLEAN, отдельный от чисел -1, 1 и 0 и от строк.

Без кавычек TRUE записывает логическое значение, а "TRUE" в кавычках — строковый литерал типа STRING; при выводе текст совпадает, но типы значений различаются. Регистр букв в логических литералах не учитывается: true, True и TRUE задают одно значение.

Переменная BOOLEAN без инициализатора получает FALSE; такое же начальное значение имеют элементы массива логического типа. Логические значения хранятся в переменных, константах, полях и массивах, передаются в параметры и возвращаются из функций.

Объявление и способы получить значение

Обычная переменная объявляется через DIM. Тип можно указать явно или вывести из начального логического выражения. Константа объявляется через CONST с явным типом:

DIM <имя> AS BOOLEAN
DIM <имя> AS BOOLEAN = <логическое выражение>
DIM <имя> = <логическое выражение>
CONST <имя> AS BOOLEAN = <логическое выражение>

Имя обозначает объявленную переменную или константу, а начальное выражение должно иметь тип BOOLEAN: им может быть логический литерал, сравнение, логическая операция или вызов функции с логическим результатом. Инициализатор CONST вычисляется при выполнении объявления, поэтому может читать переменные или вызывать функции, и его значение не обязано быть известно при компиляции. После объявления константе нельзя присвоить новое значение; передача константы параметру BYREF также запрещена и вызывает MB2010, подробнее в статье CONST.

DIM ready AS BOOLEAN
DIM allowed = 2 > 1
CONST enabled AS BOOLEAN = NOT FALSE
PRINT ready
PRINT allowed
PRINT enabled

Результат:

FALSE
TRUE
TRUE

Сравнения и условия

Сравнение возвращает результат типа BOOLEAN: count > 0 проверяет положительность числа, name = "Ada" — равенство строки заданному тексту. Два логических значения сравниваются только на равенство = или неравенство <>; сравнение порядка, например FALSE < TRUE, не поддерживается.

В IF, ELSEIF, WHILE, DO WHILE и DO UNTIL условие должно иметь тип BOOLEAN: ни ненулевое число, ни строка "TRUE" условием не считаются, поэтому число проверяют сравнением, например number <> 0. В SELECT CASE по логическому значению выбирают отдельные значения TRUE и FALSE; диапазон для логических значений не задаётся.

Логические операции

Логическое отрицание и бинарные операции имеют самостоятельные формы записи:

NOT <логическое выражение>
<левое условие> AND <правое условие>
<левое условие> OR <правое условие>
<левое условие> XOR <правое условие>
<левое условие> EQV <правое условие>
<левое условие> IMP <правое условие>

Операнды каждой формы должны иметь тип BOOLEAN, и результат также имеет тип BOOLEAN. NOT меняет истину на ложь и ложь на истину; AND возвращает истину, если истинны оба операнда, а для OR достаточно одного истинного. XOR возвращает истину при разных значениях операндов, EQV — при одинаковых, IMP — во всех случаях, кроме истинного левого при ложном правом.

ABA AND BA OR BA XOR BA EQV BA IMP B
FALSEFALSEFALSEFALSEFALSETRUETRUE
FALSETRUEFALSETRUETRUEFALSETRUE
TRUEFALSEFALSETRUETRUEFALSEFALSE
TRUETRUETRUETRUEFALSETRUETRUE
ANOT A
FALSETRUE
TRUEFALSE

Таблицы задают результат для каждого сочетания значений; порядок вычисления операндов и случаи пропуска правого операнда разобраны ниже.

Полное и условное вычисление

AND, OR, XOR, EQV и IMP вычисляют левый операнд, затем правый, причём правый вычисляется и тогда, когда результат уже известен по левому значению. Вызов функции справа может изменить данные, вывести текст или вызвать ошибку.

Для условного вычисления предназначены отдельные формы:

<левое условие> ANDALSO <правое условие>
<левое условие> ORELSE <правое условие>

Оба операнда и результат должны иметь тип BOOLEAN. ANDALSO даёт тот же логический результат, что AND, а ORELSE — тот же, что OR, но ANDALSO не вычисляет правый операнд при ложном левом, а ORELSE — при истинном; в остальных случаях правый операнд вычисляется.

PRINT FALSE ANDALSO (1 / 0 > 0)
PRINT TRUE ORELSE (1 / 0 > 0)

Результат:

FALSE
TRUE

Деление на ноль в этом примере не выполняется. Если заменить ANDALSO на AND или ORELSE на OR, деление выполнится и возникнет MB3001. Пропускаемый правый операнд компилятор всё равно проверяет: неизвестное имя или неверный тип в нём вызывает ошибку.

Отличие от побитовых операций

Имена NOT, AND, OR, XOR, EQV и IMP используются и для побитовых операций над целыми числами: вид операции определяется типами операндов, а для INTEGER и LONG результат получается целочисленным, а не BOOLEAN. В одной бинарной операции нельзя смешивать логическое значение и число; побитовые формы также не принимают дробные числа и строки.

PRINT NOT FALSE
PRINT NOT 0
PRINT 5 AND 3

Результат:

TRUE
-1
1

NOT 0 меняет все биты целого нуля и даёт целое -1; это не означает, что логическое TRUE равно -1. Выражения TRUE = -1, FALSE = 0 и TRUE AND 1 отклоняются из-за несовместимых типов. Побитового варианта у ANDALSO и ORELSE нет.

Разрядность, смешение INTEGER и LONG и сдвиги описаны в разделе операций.

Скобки и приоритет

Унарный NOT имеет больший приоритет, чем сравнения. Логические операции следуют в порядке AND/ANDALSO, XOR, OR/ORELSE, EQV, IMP, а операции одного уровня связываются слева направо: a IMP b IMP c означает (a IMP b) IMP c.

Для отрицания целого сравнения его заключают в скобки: NOT (number = 2). Запись NOT number = 2 сначала применяет побитовый NOT к числу, а затем сравнивает результат с 2, поэтому NOT 1 = 2 возвращает FALSE, а NOT (1 = 2) — TRUE. Полная таблица приоритетов находится в разделе операций.

Текстовое представление и INPUT

PRINT выводит логические значения словами TRUE и FALSE; операция & и вставка в интерполированную строку используют такое же текстовое представление. Это преобразование для вывода не меняет тип исходного значения, а операция + строку с логическим значением не соединяет.

INPUT для BOOLEAN принимает текст TRUE или FALSE без учёта регистра. Ответы 1, 0, -1, пустая строка и русские слова не принимаются. При единственном получателе пробелы вокруг ответа делают его недопустимым, а при нескольких получателях пробелы по краям каждого поля удаляются до разбора. Подробный договор находится в статье INPUT.

Преобразования в число и обратно

Автоматические присваивания между BOOLEAN и числовыми типами не поддерживаются. Функции CINT, CLNG, CDBL, CDEC и STR не принимают BOOLEAN, а встроенной функции CBOOL в текущем языке нет.

Логическое значение из числа получают явной проверкой, например number <> 0. Число из логического значения удобно выбрать в IF:

DIM flag AS BOOLEAN = TRUE
DIM number AS INTEGER = 0
IF flag THEN
    number = -1
END IF
PRINT number
PRINT number <> 0

Результат:

-1
TRUE

Программа сама задаёт число -1 для истинного значения флага; вместо него допустимо присвоить 1 или другое число, поскольку язык не устанавливает числового кода истины.

Диагностика

  • MB2003: присваивание числа или строки переменной BOOLEAN, присваивание BOOLEAN числовой переменной, смешение логического и числового операндов, упорядоченное сравнение BOOLEAN или вызов числового преобразования с BOOLEAN.
  • MB2008: условие IF, WHILE или DO не имеет типа BOOLEAN.
  • MB2005: вызов отсутствующей функции, например CBOOL.
  • MB2001: использование необъявленного имени, в том числе в пропускаемом правом операнде ANDALSO или ORELSE.
  • MB3003: ответ INPUT не может быть разобран как BOOLEAN.
  • MB3001: вычисляемый операнд выполняет деление на ноль; AND и OR не защищают от такой ошибки.

Запускаемые примеры

См. также

Типы данных · Операции и приоритет · Преобразования · IF · INPUT