Булевый, или логический, тип данных в Pascal
Создано: 17.04.2026
В языках программирования есть булевый, или логический, тип данных, значения которого используются часто, а переменные этого типа создаются редко. Чаще всего булевские значения появляются в результате выполнения логических выражений в заголовках условного оператора и циклов. Ранее мы просто говорили, что такие условия либо правдивые, либо ложные. Однако правда и ложь — это реально существующие значения в программировании. И принадлежат они особому своему типу данных.
В Pascal логические выражения (в том числе сравнения) возвращают либо встроенную константу True, либо False. Первая переводится как "истина, правда", вторая — как "ложь, ошибка". Эти константы принадлежат типу boolean, то есть булевскому. Никаких других значений у этого типа нет: только true и false.
Поскольку тип существует, мы можем объявлять переменные этого типа и присваивать им значения напрямую:
var t, f: boolean; begin t := True; f := False; writeln(t); writeln(f); end.
TRUE FALSE
Проверьте, можно ли присваивать булевым переменным значения путем их ввода с клавиатуры?
Если задаться вопросом, сколько места в памяти отводится под булевскую переменную, то окажется что 1 байт:
writeln(sizeof(boolean)); // 1 writeln(sizeof(t)); // 1 writeln(sizeof(f)); // 1 writeln(sizeof(True)); // 1 writeln(sizeof(False)); // 1
Как мы знаем, байт состоит из восьми битов, в которых могут хранится только нули и единицы. Получается, что с их помощью в случае булева типа закодированы слова True и False. В определенном смысле это так, потому что правде сопоставляется состояние байта, которое описывается как 00000001, а лжи — 00000000. В принципе байт избыточен для хранения всего двух значений, для этого достаточно одного бита. Но Pascal, как и процессор, работает именно с адресуемыми участками памяти, а меньше байта их нет.
В Pascal есть и другие логические типы, помимо boolean, их рассмотрение мы оставим за рамками этого курса.
Теперь, зная о существовании булевского типа данных, взглянем на логические выражения немного глубже. В заголовках управляющих конструкций (ветвлений и циклов) не обязательно писать именно их. Там можно указать только булевую переменную, а то, чему она равна, будет определяться до этого:
var n, m: integer; pos: boolean; begin readln(n, m); pos := (n > 0) and (m > 0); if pos then writeln('Оба числа положительные'); end.
В переменной pos будет содержаться значение True, если логическое выражение справа от знака присваивания вернет истину. Более того, можно разъединить сложное логическое выражение на простые:
pn := n > 0; pm := m > 0; pos := pn and pm;
Здесь в переменных pn и pm уже содержатся значения True или False, и когда выполняется pn and pm, то вместо имен подставляются их значения. Если одна переменная True и другая тоже True, то получится pos := True and True.
Хотя так, как показано выше, делают редко, подобный "вынос" и "разложение" логического выражения дает нам понимание происходящего. Теперь мы можем лучше понять как работают операторы and, or, not, xor и построить для них так называемые "таблицы истинности".
-
Конъюнкция (логическое умножение, пересечение) —
and. Выражениеa and bдает значениеtrueтолько в том случае, если a и b имеют значениеtrue. Во всех остальных случаях значения выраженияa and bдаетfalse.true and true = true true and false = false false and true = false false and false = false
-
Дизъюнкция (логическое сложение, объединение) —
or. Выражениеa or bдает значениеfalseтолько в том случае, если a и b имеют значениеfalse. Во всех остальных случаях результат —true.true or true = true true or false = true false or true = true false or false = false
-
Отрицание (инверсия) —
not. Выражениеnot aимеет значение, противоположное значению a.not true = false not false = true
-
Исключающее ИЛИ —
xor. Выражениеa xor bдает значениеtrueтолько в том случае, когда только один из операндов имеет значениеtrue.true xor true = false true xor false = true false xor true = true false xor false = false
Проверьте, можно ли сравнивать true и false, то есть ставить между ними операторы >, < и т.п. Если да, то какой вывод надо сделать о том, как соотносятся между собой эти булевы значения?
Еще раз напомним последовательность выполнения логических операторов, если они находятся в одном выражении: сначала not, потом and, затем or. В языке Паскаль сначала выполняются логические операторы (and, or, xor, not), а уже потом операторы отношений (>, >=, <, <=, <>, =), поэтому не нужно забывать расставлять скобки в сложных логических выражениях.

Сложные булевы выражения могут не обрабатываться до конца, если продолжение вычислений не изменит результат. Если булево выражение в обязательном порядке нужно обрабатывать до конца, то это обеспечивается включением директивы компиляции {B+}.
Задания для дополнительной или самостоятельной работы:
- Почему логические значения можно передавать в такие функции как
ord,succ,pred, процедурыincиdec, которые применимы только к перечисляемым типам? Разработайте программу, где используется одна из этих функций с булевым параметром. - В Паскале есть стандартная функция
odd(x), которая возвращаетtrue, если x нечетный (x — целое число). Напишите программу, которая запрашивает два числа с ввода и сообщает, оба ли они четные или нет?