stringtranslate.com

Логический тип данных

В информатике Boolean (иногда сокращается до Bool) — это тип данных , который имеет одно из двух возможных значений (обычно обозначаемых true и false ) , который предназначен для представления двух значений истинности логики и булевой алгебры . Она названа в честь Джорджа Буля , который впервые определил алгебраическую систему логики в середине 19 века. Тип данных Boolean в первую очередь связан с условными операторами, которые позволяют выполнять различные действия путем изменения потока управления в зависимости от того , истинно или ложно заданное программистом логическое условие . Это частный случай более общего логического типа данных — логика не всегда должна быть логической (см. вероятностную логику ).

Общие сведения

В языках программирования со встроенным логическим типом данных, таких как Pascal и Java , операторы сравнения, такие как >и, обычно определяются для возврата логического значения. Для проверки логических выражений можно определить условные и итеративные команды.

Языки без явного логического типа данных, такие как C90 и Lisp , могут по-прежнему представлять значения истинности каким-либо другим типом данных. Common Lisp использует пустой список в качестве значения false и любое другое значение в качестве значения true. Язык программирования C использует целочисленный тип, где реляционные выражения, такие как i > jи логические выражения, связанные &&и ||определены как имеющие значение 1, если истинно, и 0, если ложно, тогда как тестовые части if, while, forи т. д. рассматривают любое ненулевое значение как истинный. [1] [2] Действительно, булева переменная может рассматриваться (и реализовываться) как числовая переменная с одной двоичной цифрой ( битом ) или как битовая строка длины один, которая может хранить только два значения. Реализация логических значений в компьютерах, скорее всего, представлена ​​в виде полного слова , а не бита; обычно это связано с тем, как компьютеры передают блоки информации.

Большинство языков программирования, даже те, которые не имеют явного булева типа, поддерживают булевы алгебраические операции, такие как конъюнкция ( AND, &, *), дизъюнкция ( OR, |, +), эквивалентность ( EQV, =, ==), исключительная или /неэквивалентность ( XOR, NEQV, ^, !=, ¬) , и отрицание ( NOT, ~, !, ¬).

В некоторых языках, таких как Ruby , Smalltalk и Alice, значения true и false принадлежат отдельным классам , например, Trueи Falseсоответственно, поэтому не существует одного логического типа .

В SQL , который использует трехзначную логику для явных сравнений из-за специальной обработки Nulls , тип данных Boolean (введенный в SQL:1999 ) также определен как включающий более двух значений истинности, так что логические значения SQL могут хранить все значения. логические значения, полученные в результате оценки предикатов в SQL. Столбец логического типа может быть ограничен только TRUEи FALSEхотя.

Реализации для конкретного языка

АЛГОЛ и встроенный тип BOOLEAN

Одним из первых языков программирования, обеспечивающих явный BOOLEANтип данных, является АЛГОЛ 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оператор принимает арифметическое выражение и переходит в одно из трех мест в зависимости от его знака; см. арифметику ЕСЛИ . FORTRAN IV (1962), однако, следует примеру ALGOL 60, предоставляя логический тип данных ( LOGICAL), литералы истинности ( .TRUE.и .FALSE.), логические операторы числового сравнения ( .EQ., .GT.и т. д.) и логические операторы ( .NOT., .AND., .OR.). В операторах для анализа или форматирования логических значений предоставляется FORMATспециальный дескриптор формата (' '). [4]L

Лисп и схема

Язык Лисп (1958 г.) никогда не имел встроенного логического типа данных. Вместо этого условные конструкции, например, condпредполагают, что логическое значение false представлено пустым списком (), который определяется как специальный атом nilили NIL; тогда как любое другое s-выражение интерпретируется как истинное . Для удобства в большинстве современных диалектов Лиспа атому предопределено tзначение value t, поэтому его tможно использовать в качестве мнемонической записи для true .

Этот подход ( в качестве логического значения может быть использовано любое значение ) сохранился в большинстве диалектов Лиспа ( Common Lisp , Scheme , Emacs Lisp ), и подобные модели были приняты многими языками сценариев , даже теми, которые имели отдельный логический тип или логические значения; хотя какие значения интерпретируются как ложные , а какие истинные , варьируются от языка к языку. Например, в Scheme значение false — это атом, отличный от пустого списка, поэтому последний интерпретируется как true . С другой стороны, Common Lisp также предоставляет выделенный booleanтип, полученный в результате специализации символа. [5]

Паскаль, Ада и Хаскелл

Язык Паскаль (1970) популяризировал концепцию определяемых программистом перечислимых типов , ранее доступных с различной номенклатурой в COBOL , FACT и JOVIAL . Затем был предоставлен встроенный Booleanтип данных в виде предопределенного перечислимого типа со значениями FALSEи TRUE. По определению, все сравнения, логические операции и условные операторы применяются к Booleanзначениям и/или возвращают их. В остальном Booleanтип имел все возможности, доступные для перечислимых типов в целом, такие как упорядочивание и использование в качестве индексов. Напротив, преобразование между Booleans и целыми числами (или любыми другими типами) по-прежнему требовало явных тестов или вызовов функций, как в АЛГОЛе 60. Этот подход ( Boolean — перечислимый тип ) был принят большинством более поздних языков, в которых были перечислимые типы, таких как Modula. , Ада и Хаскелл .

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

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

После того, как перечислимые типы enumбыли добавлены в версию C Американского национального института стандартов , ANSI C (1989), многие программисты C привыкли определять свои собственные логические типы как таковые из соображений читаемости. Однако согласно стандартам языка перечислимые типы эквивалентны целым числам; поэтому эффективное тождество между логическими и целыми числами по-прежнему справедливо для программ на языке C.

Стандарт C (начиная с C99 ) предоставляет логический тип, называемый _Bool. Включив заголовок stdbool.h, можно использовать более интуитивное имя boolи константы trueи false. Язык гарантирует, что любые два истинных значения будут сравниваться равными (чего было невозможно достичь до введения типа). Логические значения по-прежнему ведут себя как целые числа, могут храниться в целочисленных переменных и использоваться везде, где допустимы целые числа, в том числе при индексировании, арифметике, синтаксическом анализе и форматировании. Этот подход ( логические значения — это просто целые числа ) был сохранен во всех более поздних версиях C. Обратите внимание, что это не означает, что любое целочисленное значение может быть сохранено в логической переменной.

В C++ есть отдельный тип данных Boolean bool, но с автоматическими преобразованиями из скалярных значений и значений указателей, которые очень похожи на те, что есть в C. Этот подход был принят также во многих более поздних языках, особенно в некоторых языках сценариев, таких как AWK .

Язык программирования D имеет правильный логический тип данных bool. Тип boolпредставляет собой тип размером в байт, который может содержать только значения true или false. Единственные операторы, которые могут принимать операнды типа bool: &, |, ^, &=, |=, ^=, !, &&, || и ?:. Значение boolможет быть неявно преобразовано к любому целочисленному типу, при этом false становится равным 0, а true — 1. Числовые литералы 0 и 1 могут быть неявно преобразованы в логические значения false и true соответственно. Приведение выражения к boolозначает проверку на 0 или !=0 для арифметических типов и на значение null или !=null для указателей или ссылок.

Objective-C также имеет отдельный тип данных Boolean BOOL, возможные значения которого равны YESили NO, что эквивалентно true и false соответственно. [6] Кроме того, в компиляторах Objective-C, поддерживающих C99, _Boolможно использовать тип C, поскольку Objective-C является надмножеством C.

Джава

В Java значение booleanтипа данных может быть только trueили false. [7]

Перл и Луа

В Perl нет логического типа данных. Вместо этого любое значение может вести себя как логическое значение в логическом контексте (условие ifили whileоператор, аргумент &&или ||и т. д.). Число 0, строки "0" и "", пустой список ()и специальное значение undefоцениваются как false. [8] Все остальное оценивается как true.

Lua имеет логический тип данных, но нелогические значения также могут вести себя как логические значения. Незначение nilоценивается как ложное, тогда как значение любого другого типа данных оценивается как истинное. Сюда входит пустая строка ""и число 0, которые очень часто встречаются falseв других языках.

ПЛ/И

PL/I не имеет логического типа данных. Вместо этого операторы сравнения генерируют значения BIT(1); '0'B представляет ложь , а '1'B представляет истину . Операнды, например, &, |, ¬преобразуются в битовые строки, и операции выполняются над каждым битом. Элемент -выражение оператора IFистинно, если какой-либо бит равен 1.

Рекс

Rexx не имеет логического типа данных. Вместо этого операторы сравнения генерируют 0 или 1; 0 представляет ложь , а 1 представляет истину . Операнды, например, &, |, ¬, должны быть 0 или 1.

Ткл

Tcl не имеет отдельного логического типа. Как и в C, используются целые числа 0 (ложь) и 1 (истина — фактически любое ненулевое целое число). [9]

Примеры кодирования:

 установить  v 1, если { $v } { помещает «V равно 1 или истинно» }         

Вышеупомянутое покажетV равно 1 или правдапоскольку выражение оценивается как 1.

 установите  v "" if { $v } ....      

Вышеуказанное приведет к ошибке, поскольку переменная v не может быть оценена как 0 или 1.

Python, Ruby и JavaScript

Python , начиная с версии 2.3, имеет тип , boolкоторый является подклассомint стандартного целочисленного типа. [10] Он имеет два возможных значения: Trueи False, которые являются специальными версиями 1 и 0 соответственно и ведут себя соответствующим образом в арифметическом контексте. Кроме того, числовое значение нуля (целое или дробное), нулевое значение ( None), пустая строка и пустые контейнеры (списки, наборы и т. д.) считаются логическими значениями false; все остальные значения по умолчанию считаются логическими истинными. [11] Классы могут определять, как их экземпляры обрабатываются в логическом контексте, с помощью специального метода __nonzero__(Python 2) или __bool__(Python 3). Для контейнеров __len__(специальный метод определения длины контейнеров) используется, если не определен явный логический метод преобразования.

В Ruby , напротив, только nil(нулевое значение Ruby) и специальный falseобъект имеют значение false ; все остальное (включая целое число 0 и пустые массивы) истинно .

В JavaScript пустую строку ( ""), null, undefined, NaN, +0, −0 и false[12] иногда называют ложной ( дополнение которой истинно ) , чтобы различать логические значения со строгой проверкой типа и принудительные . [13] В отличие от Python, пустые контейнеры (массивы, карты, наборы) считаются правдивыми. Такие языки, как PHP, также используют этот подход.

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 «могут использоваться взаимозаменяемо и обозначать одно и то же». [14] [15] Это вызвало некоторые разногласия, поскольку идентификация подвергает НЕИЗВЕСТНО правилам сравнения равенства для NULL. Точнее, это не TRUE , а UNKNOWN/NULL . [16] По состоянию на 2012 год лишь немногие основные системы SQL реализуют функцию T031. [17] Firebird и PostgreSQL являются заметными исключениями, хотя PostgreSQL не реализует литерал UNKNOWN ; вместо этого можно использовать. [18]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), [19] также не имеет логического типа данных. Подобно MS SQL Server, он использует тип данных BIT . [20] В Access он известен как тип данных «Да/Нет» [21], который может иметь два значения; Да (Правда) или Нет (Ложь). Тип данных BIT в Access также может быть представлен в числовом виде; True равно −1, а False равно 0. [22] Это отличается от MS SQL Server двумя способами, хотя оба являются продуктами Microsoft:

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

PostgreSQL имеет отдельный тип BOOLEAN , как и в стандарте [23] , который позволяет хранить предикаты непосредственно в столбце BOOLEAN и позволяет использовать столбец BOOLEAN непосредственно в качестве предиката в предложении WHERE .

В MySQL BOOLEAN рассматривается как псевдоним ; [24] ИСТИНА соответствует целому числу 1, а ЛОЖЬ соответствует целому числу 0. [25] Любое ненулевое целое число является истинным в определенных условиях.TINYINT(1)

Таблица

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

Функция Tableau INT()преобразует логическое значение в число, возвращая 1 для значения True и 0 для значения False. [28]

Форт

Форт (язык программирования) не имеет логического типа, он использует обычные целые числа: значение 0 (все младшие биты) представляет ложь, а -1 (все старшие биты) представляет истину. Это позволяет языку определять только один набор логических операторов вместо одного для математических вычислений и одного для условий. [29]

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

Рекомендации

  1. ^ Керниган, Брайан В .; Ричи, Деннис М (1978). Язык программирования C (1-е изд.). Энглвуд Клиффс, Нью-Джерси : Прентис Холл . п. 41. ИСБН 0-13-110163-3.
  2. ^ Плаугер, П.Дж .; Броди, Джим (1992) [1989]. Справочник программиста C по стандартам ANSI и ISO. Майкрософт Пресс . стр. 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 . Перепечатано в Справочнике по математическим языкам . Онлайн-версия. Архивировано 14 августа 2011 г. на Wayback Machine, доступ осуществлен 16 ноября 2011 г.
  5. ^ «CLHS: Введите BOOLEAN».
  6. ^ «Руководства и пример кода». разработчик.apple.com . Архивировано из оригинала 7 сентября 2011 года . Проверено 1 мая 2018 г.
  7. ^ "Явские логические значения" . Интернет-руководства W3Schools . Проверено 17 февраля 2021 г.
  8. ^ "perlsyn - Синтаксис Perl / Правда и ложь" . Архивировано из оригинала 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. ^ «Выражения». Документация Python v3.3.2 . Архивировано из оригинала 22 мая 2013 года . Проверено 15 мая 2013 г.
  12. ^ «Спецификация языка ECMAScript» (PDF) . п. 43. Архивировано из оригинала (PDF) 12 апреля 2015 г. Проверено 12 марта 2011 г.
  13. ^ «Элементы стиля JavaScript». Дуглас Крокфорд. Архивировано из оригинала 17 марта 2011 года . Проверено 5 марта 2011 г.
  14. ^ C. Дата (2011). SQL и реляционная теория: как писать точный код SQL. О'Рейли Медиа, Инк. с. 83. ИСБН 978-1-4493-1640-2.
  15. ^ ИСО/МЭК 9075-2:2011 §4.5
  16. ^ Мартин Пригмор (2007). Введение в базы данных с веб-приложениями. Пирсон Образования Канады. п. 197. ИСБН 978-0-321-26359-9.
  17. ^ Троэлс Арвин, Обзор реализации типа данных BOOLEAN. Архивировано 9 марта 2005 г. на Wayback Machine.
  18. ^ «PostgreSQL: Документация: 10: 8.6. Логический тип» . www.postgresql.org . Архивировано из оригинала 9 марта 2018 года . Проверено 1 мая 2018 г.
  19. ^ «Миграция базы данных Access на SQL Server». support.microsoft.com . Проверено 19 октября 2020 г.
  20. ^ о365devx. «Типы данных SQL (Справочник по базе данных Access Desktop)». docs.microsoft.com . Проверено 19 октября 2020 г.{{cite web}}: CS1 maint: числовые имена: список авторов ( ссылка )
  21. ^ «Введение в типы данных и свойства полей». support.microsoft.com . Проверено 19 октября 2020 г.
  22. ^ «Логические данные — Учебное пособие по MS-Access» . sourcedaddy.com . Проверено 19 октября 2020 г.
  23. ^ «Булев тип». 27 октября 2016 г.
  24. ^ «MySQL :: Справочное руководство по MySQL 8.0 :: 12.1.1 Обзор числовых типов» . dev.mysql.com . Архивировано из оригинала 22 сентября 2016 г.
  25. ^ «MySQL :: Справочное руководство MySQL 8.0 :: 9.1.6 Логические литералы» . dev.mysql.com .
  26. ^ «Типы данных». help.tableau.com . Проверено 19 октября 2020 г.
  27. ^ «Форматирование вычислений в таблице» . help.tableau.com . Проверено 19 октября 2020 г.
  28. ^ «Булевое значение делает Tableau быстрее - правда или ложь?». ТАР Решения . 11 сентября 2020 г. Проверено 19 октября 2020 г.
  29. ^ «4. Решения, решения...» Forth Inc. 11 февраля 2022 г. Проверено 11 февраля 2022 г.