Boolean: что такое логический тип данных и как работают true и false

Boolean (bool, логический тип) хранит одно из двух значений: true или false.

Разбираем операции И, ИЛИ, НЕ, короткое замыкание, ложные значения в Python и JavaScript, NULL в SQL и пять ошибок, из-за которых условие срабатывает не так, как задумано.

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 2958 статей автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3612 экспертных мнений Подписаться на Телеграм-канал
Обложка: Boolean: что такое логический тип данных и как работают true и false

Boolean (bool, логический или булев тип) — тип данных с двумя значениями: true (истина) и false (ложь). Его возвращает любое сравнение вроде age >= 18, и по нему программа решает, выполнить ли ветку if или повторить цикл ещё раз.

Название тип получил по имени математика Джорджа Буля, автора алгебры логики. Ниже разберём, как boolean записывается в Python, JavaScript, Java, C и SQL, какие с ним бывают операции и какие ошибки с ним встречаются чаще всего. Общую картину о том, как языки относятся к типам, даёт статья о типизации в программировании.

CheckroiCheckroiПодборка курсов по Javascript209 курсов • 37 школСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Что такое boolean и откуда берутся true и false

Рой переключает большой тумблер между двумя положениями: включено и выключено

Переменная типа boolean хранит ответ «да» или «нет». Чаще всего вы не пишете true руками, а получаете его из сравнения:

age = 20
is_adult = age >= 18
print(is_adult, type(is_adult))
True <class 'bool'>

Идея во всех языках одна, а запись разная. Регистр букв важен: в Python значения пишутся с заглавной, в JavaScript и Java строчными.

Язык Тип Значения Что важно знать
Python bool True, False bool наследуется от int, True + True даёт 2
JavaScript boolean true, false в условии любое значение приводится к логическому
Java boolean true, false число в boolean не приводится даже явно
C# bool true, false значение по умолчанию false, для трёх состояний есть bool?
C bool (до C23 _Bool) true, false 0 считается ложью, любое другое число истиной
SQL (PostgreSQL) boolean TRUE, FALSE, NULL третье состояние «неизвестно»

Правила для каждого языка описаны в документации: Python, спецификация Java, справочник C#, cppreference для C и PostgreSQL. Java и JavaScript похожи только названием, и логический тип у них ведёт себя по-разному. Чем ещё отличаются эти языки, разобрано в материале про Java и JavaScript.

Логические операции И, ИЛИ, НЕ

Две дорожки расходятся от развилки: по одной горит зелёный свет, другая ждёт своей очереди

Булевы значения комбинируют тремя базовыми операциями. В Python это слова and, or, not, в JavaScript, Java, C и C# символы &&, ||, !.

  • И (and, &&) даёт true, только если истинны оба операнда.
  • ИЛИ (or, ||) даёт true, если истинен хотя бы один.
  • НЕ (not, !) переворачивает значение.

Все варианты умещаются в таблицу истинности:

A B A и B A или B не A
true true true true false
true false false true false
false true false true true
false false false false true

Порядок вычисления такой: сначала НЕ, потом И, потом ИЛИ. Поэтому выражение True or True and False в Python вернёт True: часть с and посчитается первой.

print(True and False, True or False, not True)
print(True or True and False)
print(not 1 == 2)
False True False
True
True

Третий результат новички обычно не ожидают. Документация Python объясняет: у not приоритет ниже, чем у операторов сравнения, и not a == b читается как not (a == b). Полный список приоритетов и знаков есть в разборе операторов Python.

Канал основателя Checkroi Вани Буявца3 700 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединиться

Короткое замыкание: когда вторую часть не проверяют

Если по первому операнду ответ уже ясен, второй не вычисляется. В False and x результат будет false при любом x, а в True or x всегда true.

def check():
    print("вызов check()")
    return True

print(False and check())
print(True or check())
False
True

Строка «вызов check()» не напечаталась ни разу: функция не запускалась. На этом построен частый приём защиты от ошибок: if user and user.is_admin не упадёт, когда user пуст, потому что до второй проверки дело не дойдёт.

В JavaScript правило то же. На нём построены проверки вида el && el.remove(): элемент страницы удаляют, только если он нашёлся. Как искать элементы и что вернёт пустой поиск, показано в статье о DOM-дереве в JavaScript.

Тяжёлую или опасную проверку ставьте второй. Лёгкая и отсекающая пусть стоит первой.

Какие значения считаются ложными

В условие можно передать не только true или false. Python и JavaScript сами приводят число, строку или список к логическому значению, и списки «ложных» значений у них совпадают не полностью.

print(bool(0), bool(""), bool([]), bool("0"), bool("False"), bool([0]))
False False False True True True
console.log(Boolean(0), Boolean(""), Boolean([]), Boolean("0"), Boolean("false"), Boolean(NaN), Boolean(null), Boolean(undefined));
false false true true true false false false
Значение Python JavaScript
0, 0.0 ложь ложь
пустая строка ложь ложь
пустой список [] ложь истина
пустой словарь или объект {} ложь истина
строка "0" или "false" истина истина
None / null, undefined ложь ложь
NaN истина ложь

Перечни взяты из раздела Truth Value Testing и глоссария MDN. В таблице MDN для JavaScript их девять: кроме перечисленных, туда входят -0, 0n и редкий document.all.

Разница в пустом списке и NaN часто ломает код у тех, кто переходит с Python на JavaScript или обратно. Если вы только выбираете первый язык, загляните в разбор о том, зачем новичку JavaScript.

В Java так не получится. По спецификации языка условие if должно иметь тип boolean или Boolean, иначе код не скомпилируется. Число превращают в логическое значение сравнением x != 0, этот способ приводит раздел о типе boolean.

Boolean и числа

До стандарта C99 отдельного логического типа в C не было: условие проверяло число, и всё, кроме нуля, считалось истиной. В C99 появился _Bool, в C23 bool, true и false стали ключевыми словами. Внутри это по-прежнему 1 и 0.

#include <stdio.h>
#include <stdbool.h>
int main(void) {
    bool ready = false;
    int a = 3, b = 7;
    printf("%d %d %d\n", ready, true, a && b);
    return 0;
}
0 1 1

В Python похожее устройство: bool там подкласс int.

print(True + True, True == 1, isinstance(True, int))
2 True True

Посчитать, сколько элементов прошли проверку, можно через sum(x > 0 for x in data). Но документация не рекомендует полагаться на то, что True ведёт себя как 1, и советует явно вызывать int(). Код с явным преобразованием проще читать. Потренироваться на таких выражениях можно в 30 задачах по Python для начинающих, а системно язык разбирают на курсах по Python.

Логическое значение часто служит условием цикла: while running: повторяет тело, пока флаг не станет false. Как не попасть в бесконечный цикл, показано в статье о цикле while в Python.

Частые ошибки с boolean

Рой с лупой проверяет переключатель после исправления ошибки

Строка «false» оказывается истиной

Значение из конфига, формы или переменной окружения приходит строкой. bool("False") в Python и Boolean("false") в JavaScript возвращают true, потому что строка непустая.

Решение: сравнивайте текст явно, например value.lower() in ("true", "1", "yes").

and и or возвращают не true и false

В Python и JavaScript эти операторы отдают один из операндов, а не логическое значение. Для Python это прямо сказано в документации.

print("" or "гость", 0 and 10, [] or None)
гость 0 None

Приём удобен для значений по умолчанию, но подводит, когда 0 или пустая строка допустимы. В JavaScript для этого есть ??: 0 ?? 5 вернёт 0, а 0 || 5 вернёт 5.

Объект new Boolean(false) истинный

В JavaScript new Boolean(false) создаёт объект, а любой объект в условии считается истиной.

const flag = new Boolean(false);
if (flag) console.log("сработало", typeof flag);
сработало object

Решение: вызывайте Boolean(x) без new или пишите !!x. Конструктор для преобразования не советует использовать и MDN.

Присваивание вместо сравнения

В C запись if (x = 0) не сравнивает, а кладёт в x ноль, и условие всегда ложно. Компилятор clang 17 предупреждает об этом даже без дополнительных флагов и подсказывает заменить = на ==. Такие предупреждения не стоит пролистывать.

Лишнее сравнение с True

Конструкции if is_ready == True или if (isReady === true) работают, но читаются тяжелее, чем if is_ready. Если условие нужно записать в одну строку, пригодится тернарный оператор.

Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 700 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

Логический тип в SQL: третье значение NULL

В базах данных boolean бывает не двух, а трёх состояний. Документация PostgreSQL называет их true, false и «unknown», а «неизвестно» хранится как NULL. Из-за этого условие = FALSE теряет строки с пустым флагом.

CREATE TABLE users(name TEXT, is_active BOOLEAN);
INSERT INTO users VALUES ('Аня', TRUE), ('Борис', FALSE), ('Вера', NULL);

SELECT name FROM users WHERE is_active = FALSE;
SELECT name FROM users WHERE is_active IS NOT TRUE;
Борис
Борис
Вера

Пример выполнится и в SQLite, и в PostgreSQL: сравнение с NULL там устроено одинаково. Первый запрос не видит Веру: сравнение NULL с FALSE даёт не «ложь», а NULL. IS NOT TRUE забирает и false, и пустые значения. Подробнее о том, как NULL ведёт себя в выборках, написано в статье про NULL в SQL.

Где освоить программирование системно

С boolean можно разобраться за вечер, а дальше идут условия, циклы, функции и структуры данных. Удобнее проходить их по программе, где после каждой темы есть задачи с проверкой. План первых шагов есть в материале о программировании с нуля.

Курсы удобно сравнивать в каталоге: в разделе курсов по JavaScript видны цена, длительность и отзывы учеников.

КурсШколаСтоимость со скидкойВ рассрочкуДлитель­ностьОбзор курса от Checkroi
JavaScript
Перейти на сайт курса
SkillboxSkillbox63 829 ₽4086 ₽/мес.3 месяцаОбзор курса
Fullstack разработчик JavaScript
Перейти на сайт курса
OTUSOTUS75 000 ₽20 000 ₽/мес.6 месяцевОбзор курса
Факультет fullstack JavaScript
Перейти на сайт курса
GeekBrainsGeekBrains134 700 ₽3742 ₽/мес.15 месяцевОбзор курса
Fullstack-разработчик на JavaScript
Перейти на сайт курса
Академия ЭдюсонЭдюсон158 760 ₽6615 ₽/мес.11 месяцевОбзор курса
Фулстек-разработчик на JavaScript
Перейти на сайт курса
SkillboxSkillbox153 348 ₽4296 ₽/мес.11 месяцевОбзор курса

Больше программ — в полном каталоге курсов по Javascript

Часто задаваемые вопросы

Что такое boolean простыми словами?

Это тип данных для ответа «да» или «нет». У него два значения: true (истина) и false (ложь). Их возвращают сравнения вроде age >= 18, а условия if и циклы по ним решают, что делать дальше.

Чем bool отличается от boolean?

Ничем по смыслу: это названия одного логического типа в разных языках. В Python, C и C# он называется bool, в Java и JavaScript boolean. Различаются правила записи: в Python значения пишут с заглавной буквы, True и False.

Почему bool("False") в Python возвращает True?

Функция bool() проверяет не смысл строки, а её длину: любая непустая строка считается истиной. Чтобы прочитать флаг из текста, сравнивайте его явно, например value.lower() in ("true", "1", "yes").

Какие значения в Python считаются ложными?

По документации Python ложны None и False, ноль любого числового типа и пустые коллекции: строка, список, кортеж, словарь, множество, range(0). Всё остальное в условии считается истиной.

Сколько памяти занимает логический тип?

Зависит от языка и платформы. В PostgreSQL boolean занимает 1 байт, так указано в документации. В C размер bool стандарт не фиксирует, у clang 17 на macOS sizeof(bool) равен 1.

Можно ли сложить true и true?

В Python и JavaScript можно: true превращается в 1, и True + True даёт 2. В Java и C# так не получится, там логический тип с числами не смешивается.

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!