В информатике , то тип 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
оператор принимает арифметическое выражение и переходит в одно из трех мест в соответствии с его знаком; см. арифметический 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 - это атом, отличный от пустого списка, поэтому последний интерпретируется как истинный .
Паскаль, Ада и Хаскелл [ править ]
В языке Pascal (1970) была введена концепция перечисляемых типов, определяемых программистом . Затем Boolean
был предоставлен встроенный тип данных в виде предопределенного перечислимого типа со значениями FALSE
и TRUE
. По определению, все сравнения, логические операции и условные операторы применялись к значениям и / или приводили к ним Boolean
. В противном случае Boolean
тип имел все возможности, которые были доступны для перечислимых типов в целом, такие как упорядочивание и использование в качестве индексов. Напротив, преобразование между Boolean
s и целыми числами (или любыми другими типами) по-прежнему требовало явных тестов или вызовов функций, как в АЛГОЛе 60. Этот подход ( Boolean - это перечислимый тип ) был принят в большинстве более поздних языков, которые имели перечисляемые типы, такие какМодула , Ада и Хаскелл .
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
эквивалентами истинного и ложного соответственно. [5] Кроме того, в компиляторах Objective-C, поддерживающих C99, _Bool
можно использовать тип C , поскольку Objective-C является надмножеством C.
Java [ править ]
В Java значение логического типа данных может быть только true
или false
. [6]
Perl и Lua [ править ]
Perl не имеет логического типа данных. Вместо этого любое значение может вести себя как логическое в логическом контексте (условие оператора if
or while
, аргумент &&
or ||
и т. Д.). Число 0
, строки "0"
и ""
, пустой список ()
и специальное значение undef
оцениваются как false. [7] Все остальное оценивается как истина.
Lua имеет логический тип данных, но небулевские значения также могут вести себя как логические. Не-значение nil
оценивается как ложь, тогда как любой другой тип данных всегда оценивается как истинный, независимо от значения.
Tcl [ править ]
Tcl не имеет отдельного логического типа. Как и в C, используются целые числа 0 (ложь) и 1 (истина - фактически любое ненулевое целое число). [8]
Примеры кодирования:
set v 1
if { $v } { puts "V is 1 or true" }
Выше будет показано «V равно 1 или истина», так как выражение оценивается как «1».
set v ""
if { $v } ....
Вышеупомянутое приведет к ошибке, поскольку переменная 'v' не может быть оценена как '0' или '1'.
Python, Ruby и JavaScript [ править ]
Python , начиная с версии 2.3 вперед, имеет bool
тип , который представляет собой подкласс из int
, стандартного целого типа. [9] Он имеет два возможных значения: True
и False
, которые являются специальными версиями 1 и 0 соответственно и ведут себя как таковые в арифметических контекстах. Кроме того, нулевое числовое значение (целое или дробное), нулевое значение ( None
), пустая строка и пустые контейнеры (т. Е. Списки , наборы и т. Д.) Считаются логическим ложным значением; все остальные значения по умолчанию считаются логическим значением true. [10] Классы могут определять, как их экземпляры обрабатываются в логическом контексте с помощью специального метода __nonzero__
(Python 2) или__bool__
(Python 3). Для контейнеров __len__
(специальный метод определения длины контейнеров) используется, если явный метод логического преобразования не определен.
В Ruby , напротив, только nil
(нулевое значение Ruby) и специальный false
объект являются ложными , все остальное (включая целое число 0 и пустые массивы) истинно .
В JavaScript , пустая строка ( ""
), null
, undefined
, NaN
, +0, -0 и false
[11]
иногда называют falsy (из которых дополнение является truthy ) различать строго типа, проверяемых и принуждают Booleans. [12] В отличие от 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
, оператор while, такой как, 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, как в стандарте [13], который позволяет хранить предикаты непосредственно в столбце BOOLEAN и позволяет использовать столбец BOOLEAN непосредственно в качестве предиката в предложении WHERE.
В MySQL BOOLEAN рассматривается как псевдоним TINYINT (1), [14] TRUE - это то же самое, что целое число 1, а FALSE - то же самое, что целое число 0., [15] и обрабатывает любое ненулевое целое число как истинное при оценке условий. .
Стандарт 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 «могут использоваться взаимозаменяемо для обозначения одного и того же». [16] [17]Это вызвало некоторые противоречия, потому что идентификация подвергает НЕИЗВЕСТНО правилу сравнения на равенство для NULL. Точнее UNKNOWN = UNKNOWN не TRUE, а UNKNOWN / NULL. [18] По состоянию на 2012 год несколько основных систем SQL реализуют функцию T031. [19] Firebird и PostgreSQL - заметные исключения, хотя PostgreSQL не реализует литерал UNKNOWN; Вместо этого можно использовать NULL. [20]
Microsoft Access , которая использует ядро базы данных Microsoft Jet , [21] также не имеет логического типа данных. Подобно MS SQL Server, он использует тип данных BIT. [22] В Access он известен как тип данных «Да / Нет» [23], который может иметь два значения; Да (Верно) или Нет (Неверно). Тип данных BIT в Access также может быть представлен численно; Истина - -1, а ложь - 0. [24] Это отличается от MS SQL Server двумя способами, хотя оба являются продуктами Microsoft:
- Access представляет TRUE как -1, а в SQL Server - 1.
- Access не поддерживает три состояния Null, поддерживаемые SQL Server.
Табло [ править ]
Tableau Software имеет тип данных BOOLEAN. [25] Литерал логического значения - True
или False
. [26]
Логическое значение Tableau преобразуется в число с помощью INT()
функции. Обертывание логического поля INT()
возвращает 1 (для True) или 0 (для False). [27]
См. Также [ править ]
- true и false (команды) , для сценариев оболочки
- Расширение Шеннона
- stdbool.h , определения C99 для логических значений
- Булево дифференциальное исчисление
Ссылки [ править ]
- ^ Керниган, Брайан В ; Ричи, Деннис М (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.
- ^ «Отчет по алгоритмическому языку ALGOL 68, раздел 10.2.2» (PDF) . Август 1968 года. Архивировано (PDF) из оригинала 6 апреля 2008 года . Проверено 30 апреля 2007 года .
- ^ Digital Equipment Corporation, Справочное руководство программистов DECSystem10 FORTRAN IV . Перепечатано в Справочнике по математическим языкам . Онлайн-версия Заархивирована 14 августа 2011 г. на Wayback Machine, дата обращения 16 ноября 2011 г.
- ^ «Руководства и образец кода» . developer.apple.com . Архивировано 7 сентября 2011 года . Проверено 1 мая 2018 .
- ^ "Java Booleans" . Интернет-учебники 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 года .
- ^ [1]
- ^ [2]
- ^ [3]
- ^ 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.
- ^ Troels Arvin, Обзор реализации типа данных 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 .