Булевый, или логический, тип данных в 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 и построить для них так называемые "таблицы истинности".

Проверьте, можно ли сравнивать true и false, то есть ставить между ними операторы >, < и т.п. Если да, то какой вывод надо сделать о том, как соотносятся между собой эти булевы значения?

Еще раз напомним последовательность выполнения логических операторов, если они находятся в одном выражении: сначала not, потом and, затем or. В языке Паскаль сначала выполняются логические операторы (and, or, xor, not), а уже потом операторы отношений (>, >=, <, <=, <>, =), поэтому не нужно забывать расставлять скобки в сложных логических выражениях.

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

Сложные булевы выражения могут не обрабатываться до конца, если продолжение вычислений не изменит результат. Если булево выражение в обязательном порядке нужно обрабатывать до конца, то это обеспечивается включением директивы компиляции {B+}.

Задания для дополнительной или самостоятельной работы:

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