Из Википедии, бесплатной энциклопедии
  (Перенаправлено из логического типа данных )
Перейти к навигации Перейти к поиску

В информатике , то тип 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тип имел все возможности, которые были доступны для перечислимых типов в целом, такие как упорядочивание и использование в качестве индексов. Напротив, преобразование между Booleans и целыми числами (или любыми другими типами) по-прежнему требовало явных тестов или вызовов функций, как в АЛГОЛе 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 не имеет логического типа данных. Вместо этого любое значение может вести себя как логическое в логическом контексте (условие оператора ifor 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:

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

Табло [ править ]

Tableau Software имеет тип данных BOOLEAN. [25] Литерал логического значения - Trueили False. [26]

Логическое значение Tableau преобразуется в число с помощью INT()функции. Обертывание логического поля INT()возвращает 1 (для True) или 0 (для False). [27]

См. Также [ править ]

  • true и false (команды) , для сценариев оболочки
  • Расширение Шеннона
  • stdbool.h , определения C99 для логических значений
  • Булево дифференциальное исчисление

Ссылки [ править ]

  1. ^ Керниган, Брайан В ; Ричи, Деннис М (1978). Язык программирования C (1-е изд.). Энглвуд Клиффс, Нью-Джерси : Prentice Hall . п. 41 . ISBN 0-13-110163-3.
  2. ^ Plauger, PJ ; Броди, Джим (1992) [1989]. Справочник программиста по стандарту C ANSI и ISO . Microsoft Press . С.  86–93 . ISBN 1-55615-359-7.
  3. ^ «Отчет по алгоритмическому языку ALGOL 68, раздел 10.2.2» (PDF) . Август 1968 года. Архивировано (PDF) из оригинала 6 апреля 2008 года . Проверено 30 апреля 2007 года .
  4. ^ Digital Equipment Corporation, Справочное руководство программистов DECSystem10 FORTRAN IV . Перепечатано в Справочнике по математическим языкам . Онлайн-версия Заархивирована 14 августа 2011 г. на Wayback Machine, дата обращения 16 ноября 2011 г.
  5. ^ «Руководства и образец кода» . developer.apple.com . Архивировано 7 сентября 2011 года . Проверено 1 мая 2018 .
  6. ^ "Java Booleans" . Интернет-учебники W3Schools . Проверено 17 февраля 2021 .
  7. ^ "perlsyn - Синтаксис Perl / Истина и ложь" . Архивировано 26 августа 2013 года . Проверено 10 сентября 2013 года .
  8. ^ «PEP 285 - Добавление типа bool» . 4 мая 2011. Архивировано 28 марта 2018 года . Проверено 28 марта 2018 .
  9. Ван Россум, Гвидо (3 апреля 2002 г.). «PEP 285 - Добавление типа bool» . Архивировано 1 мая 2013 года . Проверено 15 мая 2013 года .
  10. ^ «Выражения» . Документация по Python v3.3.2 . Архивировано 22 мая 2013 года . Проверено 15 мая 2013 года .
  11. ^ «Спецификация языка ECMAScript» (PDF) . п. 43. Архивировано из оригинального (PDF) 12 апреля 2015 года . Проверено 12 марта 2011 .
  12. ^ «Элементы стиля JavaScript» . Дуглас Крокфорд. Архивировано 17 марта 2011 года . Проверено 5 марта 2011 года .
  13. ^ [1]
  14. ^ [2]
  15. ^ [3]
  16. ^ C. Дата (2011). SQL и теория отношений: как писать точный код SQL . O'Reilly Media, Inc. стр. 83. ISBN 978-1-4493-1640-2.
  17. ^ ISO / IEC 9075-2: 2011 §4.5
  18. ^ Мартин Пригмор (2007). Введение в базы данных с веб-приложениями . Pearson Education Canada. п. 197. ISBN 978-0-321-26359-9.
  19. ^ Троэлс Арвин, Обзор реализации типа данных BOOLEAN. Архивировано 9 марта2005 г. на Wayback Machine.
  20. ^ «PostgreSQL: Документация: 10: 8.6. Логический тип» . www.postgresql.org . Архивировано 9 марта 2018 года . Проверено 1 мая 2018 .
  21. ^ «Перенести базу данных Access на SQL Server» . support.microsoft.com . Проверено 19 октября 2020 .
  22. ^ o365devx. «Типы данных SQL (справочник по базам данных Access для настольных компьютеров)» . docs.microsoft.com . Проверено 19 октября 2020 .
  23. ^ «Введение в типы данных и свойства полей» . support.microsoft.com . Проверено 19 октября 2020 .
  24. ^ «Логические данные - Учебное пособие по MS-Access» . sourcedaddy.com . Проверено 19 октября 2020 .
  25. ^ «Типы данных» . help.tableau.com . Проверено 19 октября 2020 .
  26. ^ «Форматирование вычислений в Таблице» . help.tableau.com . Проверено 19 октября 2020 .
  27. ^ "Boolean делает Tableau быстрее - правда или ложь?" . Решения TAR . 2020-09-11 . Проверено 19 октября 2020 .