В информатике булевый тип ( иногда сокращается до Bool) — это тип данных , который имеет одно из двух возможных значений (обычно обозначаемых как true и false ), который предназначен для представления двух значений истинности логики и булевой алгебры . Он назван в честь Джорджа Буля , который первым определил алгебраическую систему логики в середине 19 века. Булевский тип данных в первую очередь связан с условными операторами, которые допускают различные действия путем изменения потока управления в зависимости от того, оценивается ли указанное программистом булево условие как true или false. Это особый случай более общего логического типа данных — логика не всегда должна быть булевой (см. вероятностная логика ).
В языках программирования со встроенным типом данных Boolean, таких как Pascal и Java , операторы сравнения, такие как >
и , ≠
обычно определяются для возврата Boolean значения. Условные и итеративные команды могут быть определены для проверки выражений с Boolean значениями.
Языки без явного типа данных Boolean, такие как C90 и Lisp , могут по-прежнему представлять значения истины каким-либо другим типом данных. Common Lisp использует пустой список для false и любое другое значение для true. Язык программирования C использует целочисленный тип, где реляционные выражения, такие как i > j
и логические выражения, соединенные с помощью &&
и , ||
определены как имеющие значение 1, если true, и 0, если false, тогда как тестовые части if
, while
, for
, и т. д. обрабатывают любое ненулевое значение как true. [1] [2] Действительно, булеву переменную можно рассматривать (и реализовывать) как числовую переменную с одной двоичной цифрой ( bit ), или как битовую строку длиной один, которая может хранить только два значения. Реализация булевых значений в компьютерах, скорее всего, представлена как полное слово , а не бит; это обычно связано со способами, которыми компьютеры передают блоки информации.
Большинство языков программирования, даже те, в которых нет явного булевского типа, поддерживают булевы алгебраические операции, такие как конъюнкция ( AND
, &
, *
), дизъюнкция ( OR
, |
, +
), эквивалентность ( EQV
, =
, ==
), исключающая или неэквивалентная ( XOR
, NEQV
, ^
, !=
, ¬
) и отрицание ( NOT
, ~
, !
, ¬
).
В некоторых языках, таких как Ruby , Smalltalk и Alice , значения true и false принадлежат отдельным классам , например, True
и False
, соответственно, поэтому не существует единого логического типа .
В SQL , который использует трехзначную логику для явных сравнений из-за его особой обработки Null , тип данных Boolean (введенный в SQL:1999 ) также определен как включающий более двух значений истинности, так что SQL Boolean может хранить все логические значения, полученные в результате оценки предикатов в SQL. Столбец типа Boolean может быть ограничен just TRUE
и FALSE
though.
Одним из самых ранних языков программирования, предоставляющих явный BOOLEAN
тип данных, является ALGOL 60 (1960) со значениями true и false и логическими операторами, обозначенными символами ' ' (и), ' ' (или), ' ' (подразумевает), ' ' (эквивалентность) и ' ' (не). Однако из-за ограничений устройств ввода и наборов символов на многих компьютерах того времени большинство компиляторов использовали альтернативные представления для многих операторов, такие как или .AND
'AND'
Этот подход со BOOLEAN
встроенным ( примитивным или иным предопределенным) типом данных был принят многими более поздними языками программирования, такими как 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), однако, следует примеру ALGOL 60, предоставляя тип данных Boolean ( LOGICAL
), литералы истины ( .TRUE.
и .FALSE.
), логический IF
оператор, операторы сравнения числовых значений с булевыми значениями ( .EQ.
, .GT.
, и т. д.) и логические операторы ( .NOT.
, .AND.
, .OR.
, .EQV.
, и .NEQV.
). В операторах предоставляется FORMAT
специальный дескриптор формата (' ') для разбора или форматирования логических значений. [4]L
Язык Lisp (1958) никогда не имел встроенного типа данных Boolean. Вместо этого условные конструкции, такие как, cond
предполагают, что логическое значение false представлено пустым списком ()
, который определяется как тот же, что и специальный атом nil
или NIL
; тогда как любое другое s-выражение интерпретируется как true . Для удобства большинство современных диалектов Lisp предопределяют атом t
как имеющий значение t
, так что его t
можно использовать в качестве мнемонической записи для true .
Этот подход ( любое значение может быть использовано как логическое значение ) сохранился в большинстве диалектов Lisp ( Common Lisp , Scheme , Emacs Lisp ), и подобные модели были приняты многими скриптовыми языками , даже имеющими отдельный логический тип или логические значения; хотя то, какие значения интерпретируются как ложные , а какие как истинные, варьируется от языка к языку. В Scheme, например, ложное значение является атомом, отличным от пустого списка, поэтому последний интерпретируется как истинный . Common Lisp, с другой стороны, также предоставляет выделенный boolean
тип, полученный как специализация символа. [5]
Язык Pascal (1970) популяризировал концепцию определяемых программистом перечислимых типов , ранее доступных с различной номенклатурой в COBOL , FACT и JOVIAL . Затем был предоставлен встроенный Boolean
тип данных как предопределенный перечислимый тип со значениями FALSE
и TRUE
. По определению, все сравнения, логические операции и условные операторы применялись к и/или выдавали Boolean
значения. В противном случае Boolean
тип имел все возможности, которые были доступны для перечислимых типов в целом, такие как упорядочение и использование в качестве индексов. Напротив, преобразование между Boolean
s и целыми числами (или любыми другими типами) по-прежнему требовало явных проверок или вызовов функций, как в ALGOL 60. Этот подход ( Boolean является перечислимым типом ) был принят большинством более поздних языков, которые имели перечислимые типы, такими как Modula , Ada и Haskell .
Первоначальные реализации языка C (1972) не предусматривали булев тип, и по сей день булевы значения обычно представляются целыми числами ( int
s) в программах на языке C. Операторы сравнения ( >
, ==
, и т. д.) определены для возврата знакового целого числа ( int
) результата, либо 0 (для false), либо 1 (для true). Логические операторы ( &&
, ||
, !
, и т. д.) и операторы проверки условий ( if
, while
) предполагают, что ноль является false, а все остальные значения являются true.
После того, как перечислимые типы ( enum
s) были добавлены в версию C Американского национального института стандартов , ANSI C (1989), многие программисты на C привыкли определять свои собственные булевы типы как таковые, для удобства чтения. Однако перечислимые типы эквивалентны целым числам согласно стандартам языка; поэтому эффективная идентичность между булевыми и целыми числами по-прежнему действительна для программ на C.
Стандартный C (начиная с C99 ) предоставляет логический тип, называемый _Bool
. Включив заголовок stdbool.h
, можно использовать более интуитивно понятное имя bool
и константы true
и false
. Язык гарантирует, что любые два истинных значения будут сравниваться как равные (чего было невозможно достичь до введения типа). Логические значения по-прежнему ведут себя как целые числа, могут храниться в целочисленных переменных и использоваться везде, где целые числа будут допустимы, включая индексацию, арифметику, синтаксический анализ и форматирование. Этот подход ( логические значения — это просто целые числа ) был сохранен во всех более поздних версиях C. Обратите внимание, что это не означает, что любое целочисленное значение может храниться в логической переменной.
В C++ есть отдельный тип данных Boolean bool
, но с автоматическими преобразованиями скалярных и указательных значений, которые очень похожи на те, что используются в C. Этот подход был принят также многими более поздними языками, особенно некоторыми скриптовыми языками, такими как AWK .
Язык программирования D имеет надлежащий тип данных boolean bool
. bool
Тип представляет собой тип размером в байт, который может содержать только значение true или false. Единственными операторами, которые могут принимать операнды типа bool, являются: &, |, ^, &=, |=, ^=, !, &&, || и ?:. Значение bool
может быть неявно преобразовано в любой целочисленный тип, при этом false становится 0, а true становится 1. Числовые литералы 0 и 1 могут быть неявно преобразованы в значения bool false и true соответственно. Приведение выражения к bool
означает проверку на 0 или !=0 для арифметических типов и на null или !=null для указателей или ссылок.
Objective-C также имеет отдельный тип данных Boolean BOOL
, возможными значениями которого являются YES
или NO
, эквиваленты true и false соответственно. [6]_Bool
Кроме того, в компиляторах Objective-C, которые поддерживают C99, может использоваться тип C , поскольку Objective-C является надмножеством C.
В Java значение boolean
типа данных может быть только либо , true
либо false
. [7]
В Perl нет типа данных Boolean. Вместо этого любое значение может вести себя как Boolean в контексте Boolean (условие оператора if
or while
, аргумент &&
or ||
и т. д.). Число 0
, строки "0"
и ""
, пустой список ()
и специальное значение undef
оцениваются как false. [8] Все остальное оценивается как true.
Lua имеет тип данных Boolean, но не-Boolean значения также могут вести себя как Boolean. Не-значение nil
оценивается как false, тогда как любое другое значение типа данных оценивается как true. Это включает в себя пустую строку ""
и число 0
, которые очень часто рассматриваются false
в других языках.
PL/I не имеет типа данных Boolean. Вместо этого операторы сравнения генерируют значения BIT(1); '0'B представляет false , а '1'B представляет true . Операнды, например, &
, |
, ¬
, преобразуются в битовые строки, и операции выполняются над каждым битом. Элемент-выражение оператора IF
является true, если любой бит равен 1.
Rexx не имеет типа данных Boolean. Вместо этого операторы сравнения генерируют 0 или 1; 0 представляет false , а 1 представляет true . Операнды, например, &
, |
, ¬
, должны быть 0 или 1.
Tcl не имеет отдельного булевого типа. Как и в C, используются целые числа 0 (ложь) и 1 (истина — фактически любое ненулевое целое число). [9]
Примеры кодирования:
установить v 1 , если { $v } { puts "V равно 1 или истинно" }
Вышеизложенное покажетV равно 1 или истиннотак как выражение оценивается как 1.
установить v "" если { $v } ....
Вышеприведенный пример выдаст ошибку, поскольку переменная v не может быть оценена как 0 или 1.
Python , начиная с версии 2.3, имеет bool
тип, который является подклассомint
, стандартного целочисленного типа. [10] Он имеет два возможных значения: True
и False
, которые являются специальными версиями 1 и 0 соответственно и ведут себя как таковые в арифметических контекстах. Кроме того, числовое значение ноль (целое или дробное), значение null ( None
), пустая строка и пустые контейнеры (списки, наборы и т. д.) считаются логическим значением false; все остальные значения по умолчанию считаются логическим значением true. [11] Классы могут определять, как их экземпляры обрабатываются в логическом контексте, с помощью специального метода __nonzero__
(Python 2) или __bool__
(Python 3). Для контейнеров __len__
используется (специальный метод определения длины контейнеров), если явный метод преобразования Boolean не определен.
В Ruby , напротив, только nil
(значение null в Ruby) и специальный false
объект являются false ; все остальное (включая целое число 0 и пустые массивы) является true .
Булевы значения появляются в SQL, когда требуется условие , например, предложение WHERE , в форме предиката, который создается с помощью таких операторов, как операторы сравнения, оператор IN , IS (NOT) NULL и т. д. Однако, помимо TRUE и FALSE , эти операторы также могут давать третье состояние, называемое UNKNOWN , когда выполняется сравнение с .NULL
Стандарт 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 «могут использоваться взаимозаменяемо, чтобы означать одно и то же». [12] [13] Это вызвало некоторые споры, поскольку идентификация подчиняет UNKNOWN правилам сравнения на равенство для NULL. Точнее, это не TRUE , а UNKNOWN/NULL . [14] По состоянию на 2012 год несколько основных систем SQL реализуют функцию T031. [15] Firebird и PostgreSQL являются заметными исключениями, хотя PostgreSQL не реализует литерал UNKNOWN ; вместо него можно использовать . [16]UNKNOWN = UNKNOWN
NULL
Обработка булевых значений различается в разных системах SQL.
Например, в Microsoft SQL Server логическое значение вообще не поддерживается, ни как отдельный тип данных, ни как представляемое в виде целого числа. Он показывает сообщение об ошибке "Выражение нелогического типа, указанное в контексте, где ожидается условие", если столбец напрямую используется в предложении WHERE , например , в то время как такой оператор, как приводит к синтаксической ошибке. Тип данных BIT , который может хранить только целые числа 0 и 1, кроме NULL , обычно используется в качестве обходного пути для хранения логических значений, но необходимо использовать обходные пути, например, для преобразования между целым числом и логическим выражением.SELECT a FROM t WHERE a
SELECT column IS NOT NULL FROM t
UPDATE t SET flag = IIF(col IS NOT NULL, 1, 0) WHERE flag = 0
Microsoft Access , который использует Access Database Engine (ACE/JET), [17] также не имеет типа данных Boolean. Подобно MS SQL Server, он использует тип данных BIT . [18] В Access он известен как тип данных Yes/No [19], который может иметь два значения: Yes (True) или No (False). Тип данных BIT в Access также может быть представлен численно; True равно −1, а False равно 0. [20] Это отличается от MS SQL Server двумя способами, хотя оба являются продуктами Microsoft:
PostgreSQL имеет отдельный тип BOOLEAN , как в стандарте [21] , который позволяет хранить предикаты непосредственно в столбце BOOLEAN и позволяет использовать столбец BOOLEAN непосредственно в качестве предиката в предложении WHERE .
В MySQL BOOLEAN рассматривается как псевдоним ; [22] TRUE — то же самое, что и целое число 1, а FALSE — то же самое, что и целое число 0. [23] Любое ненулевое целое число является истинным в условиях.TINYINT(1)
Tableau Software имеет тип данных BOOLEAN. [24] Литерал булева значения — True
или False
. [25]
Функция Tableau INT()
преобразует логическое значение в число, возвращая 1 для True и 0 для False. [26]
Forth (язык программирования) не имеет булевого типа, он использует обычные целые числа: значение 0 (все биты низкие) представляет ложь, а -1 (все биты высокие) представляет истину. Это позволяет языку определять только один набор логических операторов, вместо одного для математических вычислений и одного для условий. [27]
В некоторых языках программирования любое выражение может быть оценено в контексте, который ожидает тип данных Boolean. Обычно (хотя это зависит от языка программирования) выражения, такие как число zero , пустая строка , пустые списки и null трактуются как false, а строки с содержимым (например, "abc"), другие числа и объекты трактуются как true. Иногда эти классы выражений называются ложными и истинными. Например, в Lisp nil , пустой список, трактуется как false, а все остальные значения трактуются как true. В C число 0 или 0.0 является false, а все остальные значения трактуются как true.
В JavaScript пустая строка (""
), null
, undefined
, NaN, +0, −0 и false
[28] иногда называется ложной (дополнением к которой является истина ) для различения строго проверенных и приведенных булевых значений (см. также: Синтаксис JavaScript#Преобразование типов ). [29] В отличие от Python, пустые контейнеры (массивы, карты, наборы) считаются истинными. Такие языки, как PHP, также используют этот подход.{{cite web}}
: CS1 maint: числовые имена: список авторов ( ссылка )