В информатике , то тип Boolean данных является типом данных , который имеет одну из двух возможных значений (обычно обозначаемых правды и ложь ) , которая предназначена для представления двух значений истинности по логике и булевой алгебры . Он назван в честь Джорджа Буля , который первым определил алгебраическую систему логики в середине 19 века. Тип данных Boolean в первую очередь связан с условными операторами, которые позволяют выполнять различные действия, изменяя поток управления в зависимости от того, является ли указанное программистом логическое условиеоценивается как истина или ложь. Это частный случай более общего логического типа данных (см. Вероятностная логика ) - логика не всегда должна быть логической.
Общие
В языках программирования со встроенным логическим типом данных, таких как Pascal и Java , операторы сравнения, такие как >
и ≠
, обычно определяются для возврата логического значения. Для проверки выражений с логическим значением могут быть определены условные и итеративные команды.
Языки без явного логического типа данных, такие как C90 и Lisp , могут по-прежнему представлять значения истинности каким-либо другим типом данных. Common Lisp использует пустой список для false и любое другое значение для true. Язык программирования С использует целое число типа, где реляционные выражения , как i > j
и логические выражения , соединенные &&
и ||
определены , чтобы иметь значение 1 , если оно истинно , и 0 , если ложно, тогда как тест части if
, while
, for
и т.д., относиться к любому ненулевого значения , как правда. [1] [2] Действительно, логическая переменная может рассматриваться (и реализовываться) как числовая переменная с одной двоичной цифрой ( битом ), которая может хранить только два значения. Реализация логических значений в компьютерах, скорее всего, представлена как полное слово , а не как бит; Обычно это происходит из-за того, как компьютеры передают блоки информации.
Большинство языков программирования, даже те, без явного логического типа, имеют поддержку булевых алгебраические операции , такие как совместно ( AND
, &
, *
), дизъюнкции ( OR
, |
, +
), эквивалентность ( EQV
, =
, ==
), эксклюзивную или / неэквивалентность ( XOR
, NEQV
, ^
, !=
), и отрицание ( NOT
, ~
, !
).
В некоторых языках, как Руби , Smalltalk , и Алиса в истинные и ложные ценности принадлежат к отдельным классам , то есть, True
и False
, соответственно, так что не один булева типа .
В SQL , который использует трехзначной логики для явных сравнений из - за его специальной обработки Nulls , булева типа данных (введен в SQL: 1999 ) также определен для включения более двух значений истинности, так что SQL Booleans может хранить все логические значения, полученные в результате оценки предикатов в SQL. Столбец логического типа может быть ограничен только TRUE
и FALSE
хотя.
АЛГОЛ и встроенный логический тип
Одним из первых языков программирования, предоставляющих явный логический тип данных, является ALGOL 60 (1960) со значениями true и false и логическими операторами, обозначенными символами '' (а также), '' (или же), ''(подразумевает),''(эквивалентность) и'' (нет). Однако из-за ограничений на устройства ввода и набор символов на многих компьютерах того времени большинство компиляторов использовали альтернативные представления для многих операторов, такие как AND
или 'AND'
.
Этот подход с логическим значением в качестве встроенного ( примитивного или иным образом предопределенного) типа данных был принят во многих более поздних языках программирования, таких как Simula 67 (1967), ALGOL 68 (1970), [3] Pascal (1970), Ada ( 1980), Java (1995) и C # (2000) среди других.
Фортран
Первая версия FORTRAN (1957) и ее преемник FORTRAN II (1958) не имеют логических значений или операций; даже условный IF
оператор принимает арифметическое выражение и переходит в одно из трех мест в соответствии с его знаком; см. арифметическое ЕСЛИ . FORTRAN IV (1962), однако, следует примеру Алгол 60, обеспечивая логический тип данных ( LOGICAL
), правда литералы ( .TRUE.
и .FALSE.
), булевозначный числовые операторы сравнения ( .EQ.
, .GT.
и т.д.), и логические операторы ( .NOT.
, .AND.
, .OR.
). В FORMAT
операторах специальный дескриптор формата (' L
') предоставляется для синтаксического анализа или форматирования логических значений. [4]
Лисп и схема
В языке Lisp (1958) никогда не было встроенного логического типа данных. Вместо этого условные конструкции, например, cond
предполагают, что логическое значение false представлено пустым списком ()
, который определяется как такой же, как специальный атом nil
или NIL
; тогда как любое другое s-выражение интерпретируется как истинное . Для удобства в большинстве современных диалектов Лиспа атом заранее определен как t
имеющий значение t
, так что t
его можно использовать как мнемоническое обозначение истины .
Этот подход ( любое значение может использоваться как логическое значение ) был сохранен в большинстве диалектов Lisp ( Common Lisp , Scheme , Emacs Lisp ), и аналогичные модели были приняты во многих языках сценариев , даже в тех, которые имеют отдельный логический тип или логические значения; хотя какие значения интерпретируются как ложные, а какие истинные, варьируются от языка к языку. В Scheme, например, значение false - это атом, отличный от пустого списка, поэтому последний интерпретируется как истинный . Common Lisp, с другой стороны, также предоставляет специальный boolean
тип, производный от символа. [5]
Паскаль, Ада и Хаскелл
В языке Pascal (1970) была введена концепция перечисляемых типов, определяемых программистом . Затем Boolean
был предоставлен встроенный тип данных в виде предопределенного перечислимого типа со значениями FALSE
и TRUE
. По определению, все сравнения, логические операции и условные операторы применялись к значениям и / или приводили к ним Boolean
. В противном случае Boolean
тип имел все возможности, которые были доступны для перечислимых типов в целом, такие как упорядочивание и использование в качестве индексов. Напротив, преобразование между Boolean
s и целыми числами (или любыми другими типами) по-прежнему требовало явных тестов или вызовов функций, как в АЛГОЛе 60. Этот подход ( Boolean - это перечислимый тип ) был принят в большинстве более поздних языков, которые имели перечисляемые типы, такие как Modula , Ада и Хаскелл .
C, C ++, Objective-C, AWK
Первоначальные реализации языка C (1972 г.) не предоставляли логического типа, и по сей день логические значения обычно представлены целыми числами int
в программах на языке C. Операторы сравнения ( >
, ==
и т. Д.) Определены для возврата целочисленного int
результата со знаком ( ) либо 0 (для ложного), либо 1 (для истинного). Логические операторы ( &&
, ||
, !
и т.д.) и условие тестирования заявления ( if
, while
) предположим , что нуль является ложным , а все остальные значения являются истинными.
После того, как перечислимые типы enum
были добавлены в версию C Американского национального института стандартов , ANSI C (1989), многие программисты на C привыкли определять свои собственные логические типы как таковые для удобства чтения. Однако перечислимые типы эквивалентны целым числам в соответствии со стандартами языка; поэтому эффективное тождество логических и целых чисел по-прежнему актуально для программ на C.
Стандартный C (начиная с C99 ) предоставляет логический тип с именем _Bool
. Включив заголовок stdbool.h
, можно использовать более интуитивно понятное имя bool
и константы true
и false
. Язык гарантирует, что любые два истинных значения будут сравниваться как равные (чего было невозможно достичь до введения типа). Логические значения по-прежнему ведут себя как целые числа, могут храниться в целочисленных переменных и использоваться везде, где допустимы целые числа, включая индексацию, арифметику, синтаксический анализ и форматирование. Этот подход ( логические значения - это просто целые числа ) был сохранен во всех более поздних версиях C. Обратите внимание, что это не означает, что любое целочисленное значение может быть сохранено в логической переменной.
C ++ имеет отдельный логический тип данных bool
, но с автоматическим преобразованием из скалярных значений и значений указателя, которые очень похожи на таковые в C. Этот подход был принят также во многих более поздних языках, особенно в некоторых языках сценариев, таких как AWK .
Objective-C также имеет отдельный тип данных Boolean BOOL
с возможными значениями YES
или NO
эквивалентами истинного и ложного соответственно. [6] Кроме того, в компиляторах Objective-C, поддерживающих C99, _Bool
можно использовать тип C , поскольку Objective-C является надмножеством C.
Ява
В Java значение логического типа данных может быть только true
или false
. [7]
Perl и Lua
Perl не имеет логического типа данных. Вместо этого любое значение может вести себя как логическое в логическом контексте (условие оператора if
or while
, аргумент &&
or ||
и т. Д.). Число 0
, строки "0"
и ""
, пустой список ()
и специальное значение undef
оцениваются как false. [8] Все остальное оценивается как истина.
Lua имеет логический тип данных, но небулевские значения также могут вести себя как логические. Не-значение nil
оценивается как ложное, тогда как значение любого другого типа данных оценивается как истинное. Сюда входят пустая строка ""
и число 0
, которые очень часто используются true
в других языках.
Tcl
Tcl не имеет отдельного логического типа. Как и в C, используются целые числа 0 (ложь) и 1 (истина - фактически любое ненулевое целое число). [9]
Примеры кодирования:
набор v 1 if {$ v} {ставит "V равно 1 или истина"}
В приведенном выше примере будет показано, что «V равно 1 или истина», поскольку значение выражения равно 1.
установить v "" если {$ v} ....
Вышеупомянутое приведет к ошибке, поскольку переменная v не может быть оценена как 0 или 1.
Python, Ruby и JavaScript
Python , начиная с версии 2.3 вперед, имеет bool
тип , который представляет собой подкласс из int
, стандартного целого типа. [10] Он имеет два возможных значения: True
и False
, которые являются специальными версиями 1 и 0 соответственно и ведут себя как таковые в арифметических контекстах. Кроме того, нулевое числовое значение (целое или дробное), нулевое значение ( None
), пустая строка и пустые контейнеры (списки, множества и т. Д.) Считаются логическим ложным значением; все остальные значения по умолчанию считаются логическим значением true. [11] Классы могут определять, как их экземпляры обрабатываются в логическом контексте с помощью специального метода __nonzero__
(Python 2) или __bool__
(Python 3). Для контейнеров __len__
(специальный метод определения длины контейнеров) используется, если явный метод логического преобразования не определен.
В Ruby , напротив, ложны только nil
(нулевое значение Ruby) и специальный false
объект ; все остальное (включая целое число 0 и пустые массивы) верно .
В JavaScript , пустая строка ( ""
), null
, undefined
, NaN
, +0, -0 и false
[12] иногда называют falsy (из которых дополнение является truthy ) различать строго типа, проверяемых и принуждают Booleans. [13] В отличие от Python, пустые контейнеры (массивы, карты, наборы) считаются правдивыми. Такие языки, как PHP, также используют этот подход.
Оболочка нового поколения
Оболочка следующего поколения имеет Bool
тип. Имеет два возможных значения: true
и false
. Bool
не является взаимозаменяемым Int
и при необходимости должен быть преобразован явно. Когда требуется логическое значение выражения (например, в if
операторе), Bool
вызывается метод. Bool
метод для встроенных типов определен таким образом, что он возвращает false
числовое значение, равное нулю, null
значение, пустую строку, пустые контейнеры (списки, наборы и т. д.), внешние процессы, завершившиеся с ненулевым кодом выхода ; для других значений Bool
возвращает истину. Типы, для которых Bool
определен метод, могут использоваться в логическом контексте. При оценке выражения в логическом контексте, если соответствующий Bool
метод не определен, выдается исключение.
SQL
Логические значения появляются в SQL, когда требуется условие, такое как предложение WHERE, в форме предиката, который создается с помощью таких операторов, как операторы сравнения, оператор IN, IS (NOT) NULL и т. Д. Однако, кроме TRUE и FALSE, эти операторы может также привести к третьему состоянию, называемому UNKNOWN, при сравнении с NULL .
Обработка логических значений отличается в разных системах SQL.
Например, в Microsoft SQL Server логическое значение вообще не поддерживается, ни как отдельный тип данных, ни как целое число. Он показывает сообщение об ошибке «Выражение небулевого типа, заданное в контексте, где ожидается условие», если столбец используется непосредственно в предложении WHERE, например SELECT a FROM t WHERE a
, в то время как такой оператор, как SELECT column IS NOT NULL FROM t
дает синтаксическую ошибку. Тип данных BIT, который может хранить только целые числа 0 и 1, кроме NULL, обычно используется в качестве обходного пути для хранения логических значений, но необходимо использовать обходные пути, такие как UPDATE t SET flag = IIF(col IS NOT NULL, 1, 0) WHERE flag = 0
преобразование между целочисленным и логическим выражением.
PostgreSQL имеет отдельный тип BOOLEAN, как и в стандарте [14], который позволяет хранить предикаты непосредственно в столбце BOOLEAN и позволяет использовать столбец BOOLEAN непосредственно в качестве предиката в предложении WHERE.
В MySQL BOOLEAN рассматривается как псевдоним TINYINT (1); [15] ИСТИНА то же самое, что целое число 1, а ЛОЖЬ то же самое, что целое число 0. [16] Любое ненулевое целое число истинно в условиях.
Стандарт SQL92 представил операторы IS (NOT) TRUE, IS (NOT) FALSE и IS (NOT) UNKNOWN, которые оценивают предикат, который предшествовал введению логического типа в SQL: 1999 .
Стандарт SQL: 1999 представил тип данных BOOLEAN в качестве необязательной функции (T031). Будучи ограниченным NOT NULL
ограничением, SQL BOOLEAN ведет себя как логические значения в других языках, которые могут хранить только значения TRUE и FALSE. Однако, если он допускает значение NULL, что является значением по умолчанию, как и все другие типы данных SQL, он также может иметь специальное значение NULL. Хотя стандарт SQL определяет три литерала для типа BOOLEAN - TRUE, FALSE и UNKNOWN - он также говорит, что NULL BOOLEAN и UNKNOWN «могут использоваться взаимозаменяемо для обозначения одного и того же». [17] [18] Это вызвало некоторые противоречия, потому что идентификация подвергает НЕИЗВЕСТНО правилу сравнения на равенство для NULL. Точнее UNKNOWN = UNKNOWN не TRUE, а UNKNOWN / NULL. [19] По состоянию на 2012 год несколько основных систем SQL реализуют функцию T031. [20] Firebird и PostgreSQL - заметные исключения, хотя PostgreSQL не реализует литерал UNKNOWN; Вместо этого можно использовать NULL. [21]
Microsoft Access , которая использует Microsoft Jet Database Engine , [22] также не имеет логического типа данных. Подобно MS SQL Server, он использует тип данных BIT. [23] В Access он известен как тип данных «Да / Нет» [24], который может иметь два значения; Да (Верно) или Нет (Неверно). Тип данных BIT в Access также может быть представлен численно; Истина - -1, а ложь - 0. [25] Это отличается от MS SQL Server двумя способами, хотя оба являются продуктами Microsoft:
- Access представляет TRUE как -1, а в SQL Server - 1.
- Access не поддерживает три состояния Null, поддерживаемые SQL Server.
Tableau
Tableau Software имеет тип данных BOOLEAN. [26] Литерал логического значения - True
или False
. [27]
Функция Tableau INT()
преобразует логическое значение в число, возвращая 1 для True и 0 для False. [28]
Смотрите также
- true и false (команды) , для сценариев оболочки
- Расширение Шеннона
- Булево дифференциальное исчисление
Рекомендации
- ^ Керниган, Брайан В ; Ричи, Деннис М (1978). Язык программирования C (1-е изд.). Энглвуд Клиффс, Нью-Джерси : Prentice Hall . п. 41 . ISBN 0-13-110163-3.
- ^ Plauger, PJ ; Броди, Джим (1992) [1989]. Справочник программиста по стандарту C ANSI и ISO . Microsoft Press . С. 86–93 . ISBN 1-55615-359-7.
- ^ «Отчет по алгоритмическому языку АЛГОЛ 68, раздел 10.2.2» (PDF) . Август 1968 года. Архивировано (PDF) из оригинала 6 апреля 2008 года . Проверено 30 апреля 2007 года .
- ^ Digital Equipment Corporation, Справочное руководство программистов DECSystem10 FORTRAN IV . Перепечатано в Справочнике по математическим языкам . Онлайн-версия Заархивирована 14 августа 2011 г. на Wayback Machine, дата обращения 16 ноября 2011 г.
- ^ [1]
- ^ «Руководства и образец кода» . developer.apple.com . Архивировано 7 сентября 2011 года . Проверено 1 мая 2018 .
- ^ "Логические Java" . Интернет-учебники W3Schools . Проверено 17 февраля 2021 .
- ^ «perlsyn - Синтаксис Perl / Истина и ложь» . Архивировано 26 августа 2013 года . Проверено 10 сентября 2013 года .
- ^ «PEP 285 - Добавление типа bool» . 4 мая 2011. Архивировано 28 марта 2018 года . Проверено 28 марта 2018 .
- ^ ван Россум, Гвидо (3 апреля 2002 г.). «PEP 285 - Добавление типа bool» . Архивировано 1 мая 2013 года . Проверено 15 мая 2013 года .
- ^ «Выражения» . Документация по Python v3.3.2 . Архивировано 22 мая 2013 года . Проверено 15 мая 2013 года .
- ^ «Спецификация языка ECMAScript» (PDF) . п. 43. Архивировано из оригинального (PDF) 12 апреля 2015 года . Проверено 12 марта 2011 .
- ^ «Элементы стиля JavaScript» . Дуглас Крокфорд. Архивировано 17 марта 2011 года . Проверено 5 марта 2011 года .
- ^ [2]
- ^ [3]
- ^ [4]
- ^ C. Дата (2011 г.). SQL и теория отношений: как писать точный код SQL . O'Reilly Media, Inc. стр. 83. ISBN 978-1-4493-1640-2.
- ^ ISO / IEC 9075-2: 2011 §4.5
- ^ Мартин Пригмор (2007). Введение в базы данных с веб-приложениями . Pearson Education Canada. п. 197. ISBN 978-0-321-26359-9.
- ^ Троэлс Арвин, Обзор реализации типа данных BOOLEAN. Архивировано 9 марта2005 г. на Wayback Machine.
- ^ «PostgreSQL: Документация: 10: 8.6. Логический тип» . www.postgresql.org . Архивировано 9 марта 2018 года . Проверено 1 мая 2018 .
- ^ «Перенести базу данных Access на SQL Server» . support.microsoft.com . Проверено 19 октября 2020 .
- ^ o365devx. «Типы данных SQL (справочник по базам данных Access для настольных компьютеров)» . docs.microsoft.com . Проверено 19 октября 2020 .
- ^ «Введение в типы данных и свойства полей» . support.microsoft.com . Проверено 19 октября 2020 .
- ^ «Логические данные - Учебное пособие по MS-Access» . sourcedaddy.com . Проверено 19 октября 2020 .
- ^ «Типы данных» . help.tableau.com . Проверено 19 октября 2020 .
- ^ «Форматирование вычислений в Таблице» . help.tableau.com . Проверено 19 октября 2020 .
- ^ "Boolean делает Tableau быстрее - правда или ложь?" . Решения TAR . 2020-09-11 . Проверено 19 октября 2020 .