stringtranslate.com

Булев тип данных

Джордж Буль

В информатике булевый тип ( иногда сокращается до 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и FALSEthough.

Реализации, специфичные для конкретного языка

ALGOL и встроенный тип BOOLEAN

Одним из самых ранних языков программирования, предоставляющих явный 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тип имел все возможности, которые были доступны для перечислимых типов в целом, такие как упорядочение и использование в качестве индексов. Напротив, преобразование между Booleans и целыми числами (или любыми другими типами) по-прежнему требовало явных проверок или вызовов функций, как в ALGOL 60. Этот подход ( Boolean является перечислимым типом ) был принят большинством более поздних языков, которые имели перечислимые типы, такими как Modula , Ada и Haskell .

C, C++, D, Objective-C, AWK

Первоначальные реализации языка C (1972) не предусматривали булев тип, и по сей день булевы значения обычно представляются целыми числами ( ints) в программах на языке C. Операторы сравнения ( >, ==, и т. д.) определены для возврата знакового целого числа ( int) результата, либо 0 (для false), либо 1 (для true). Логические операторы ( &&, ||, !, и т. д.) и операторы проверки условий ( if, while) предполагают, что ноль является false, а все остальные значения являются true.

После того, как перечислимые типы ( enums) были добавлены в версию 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 и Lua

В Perl нет типа данных Boolean. Вместо этого любое значение может вести себя как Boolean в контексте Boolean (условие оператора ifor 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, Ruby и JavaScript

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

Булевы значения появляются в 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 определяет три литерала для типа BOOLEANTRUE, FALSE и UNKNOWN — он также говорит, что NULL BOOLEAN и UNKNOWN «могут использоваться взаимозаменяемо, чтобы означать одно и то же». [12] [13] Это вызвало некоторые споры, поскольку идентификация подчиняет UNKNOWN правилам сравнения на равенство для NULL. Точнее, это не TRUE , а UNKNOWN/NULL . [14] По состоянию на 2012 год несколько основных систем SQL реализуют функцию T031. [15] Firebird и PostgreSQL являются заметными исключениями, хотя PostgreSQL не реализует литерал UNKNOWN ; вместо него можно использовать . [16]UNKNOWN = UNKNOWNNULL

Обработка булевых значений различается в разных системах SQL.

Например, в Microsoft SQL Server логическое значение вообще не поддерживается, ни как отдельный тип данных, ни как представляемое в виде целого числа. Он показывает сообщение об ошибке "Выражение нелогического типа, указанное в контексте, где ожидается условие", если столбец напрямую используется в предложении WHERE , например , в то время как такой оператор, как приводит к синтаксической ошибке. Тип данных BIT , который может хранить только целые числа 0 и 1, кроме NULL , обычно используется в качестве обходного пути для хранения логических значений, но необходимо использовать обходные пути, например, для преобразования между целым числом и логическим выражением.SELECT a FROM t WHERE aSELECT column IS NOT NULL FROM tUPDATE 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:

  1. Access представляет TRUE как −1, тогда как в SQL Server это 1
  2. Access не поддерживает три состояния Null, поддерживаемые SQL Server.

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, также используют этот подход.

Смотрите также

Ссылки

  1. ^ Керниган, Брайан В .; Ритчи, Деннис М. (1978). Язык программирования C (1-е изд.). Энглвуд Клиффс, Нью-Джерси : Prentice Hall . стр. 41. ISBN 0-13-110163-3.
  2. ^ Plauger, PJ ; Brodie, Jim (1992) [1989]. Справочник программиста по стандартам ANSI и ISO на языке C. Microsoft Press . С. 86–93. ISBN 1-55615-359-7.
  3. ^ "Отчет об алгоритмическом языке АЛГОЛ 68, раздел 10.2.2" (PDF) . Август 1968. Архивировано (PDF) из оригинала 6 апреля 2008. Получено 30 апреля 2007 .
  4. ^ Digital Equipment Corporation, DECSystem10 FORTRAN IV Programmers Reference Manual . Перепечатано в Mathematical Languages ​​Handbook . Онлайн-версия Архивировано 14 августа 2011 г. на Wayback Machine, доступ получен 16 ноября 2011 г.
  5. ^ "CLHS: Тип BOOLEAN".
  6. ^ "Guides and Sample Code". developer.apple.com . Архивировано из оригинала 7 сентября 2011 г. Получено 1 мая 2018 г.
  7. ^ "Java Booleans". Онлайн-руководства W3Schools . Получено 17.02.2021 .
  8. ^ "perlsyn - Perl Syntax / Truth and Falsehood". Архивировано из оригинала 26 августа 2013 года . Получено 10 сентября 2013 года .
  9. ^ "PEP 285 -- Добавление типа bool". 4 мая 2011 г. Архивировано из оригинала 28 марта 2018 г. Получено 28 марта 2018 г.
  10. ^ Ван Россум, Гвидо (3 апреля 2002 г.). "PEP 285 — Добавление типа bool". Архивировано из оригинала 1 мая 2013 г. Получено 15 мая 2013 г.
  11. ^ "Expressions". Документация Python v3.3.2 . Архивировано из оригинала 22 мая 2013 г. Получено 15 мая 2013 г.
  12. ^ C. Date (2011). SQL и реляционная теория: как писать точный код SQL. O'Reilly Media, Inc. стр. 83. ISBN 978-1-4493-1640-2.
  13. ^ ИСО/МЭК 9075-2:2011 §4.5
  14. ^ Мартин Пригмор (2007). Введение в базы данных с веб-приложениями. Pearson Education Canada. стр. 197. ISBN 978-0-321-26359-9.
  15. ^ Троелс Арвин, Обзор реализации типа данных BOOLEAN. Архивировано 09.03.2005 на Wayback Machine.
  16. ^ "PostgreSQL: Documentation: 10: 8.6. Boolean Type". www.postgresql.org . Архивировано из оригинала 9 марта 2018 г. Получено 1 мая 2018 г.
  17. ^ "Миграция базы данных Access на SQL Server". support.microsoft.com . Получено 2020-10-19 .
  18. ^ o365devx. "Типы данных SQL (справочник по базе данных Access для настольных компьютеров)". docs.microsoft.com . Получено 19 октября 2020 г. .{{cite web}}: CS1 maint: числовые имена: список авторов ( ссылка )
  19. ^ "Введение в типы данных и свойства полей". support.microsoft.com . Получено 2020-10-19 .
  20. ^ "Boolean Data - MS-Access Tutorial". sourcedaddy.com . Получено 2020-10-19 .
  21. ^ "Булевый тип". 27 октября 2016 г.
  22. ^ "MySQL :: MySQL 8.0 Reference Manual :: 12.1.1 Numeric Type Overview". dev.mysql.com . Архивировано из оригинала 2016-09-22.
  23. ^ "MySQL :: Справочное руководство MySQL 8.0 :: 9.1.6 Булевы литералы". dev.mysql.com .
  24. ^ "Типы данных". help.tableau.com . Получено 2020-10-19 .
  25. ^ "Форматирование вычислений в Tableau". help.tableau.com . Получено 2020-10-19 .
  26. ^ "Boolean делает Tableau быстрее — правда или ложь?". TAR Solutions . 2020-09-11 . Получено 2020-10-19 .
  27. ^ "4. Решения, решения..." Forth Inc. 2022-02-11 . Получено 2022-02-11 .
  28. ^ "Спецификация языка ECMAScript" (PDF) . стр. 43. Архивировано из оригинала (PDF) 2015-04-12 . Получено 2011-03-12 .
  29. ^ "The Elements of JavaScript Style". Дуглас Крокфорд. Архивировано из оригинала 17 марта 2011 г. Получено 5 марта 2011 г.