Логический тип данных
В информатике Boolean false (иногда сокращается до Bool) — это тип данных который имеет одно из двух возможных значений (обычно обозначаемых true и , ), который предназначен для представления двух значений истинности и логики булевой алгебры . Она названа в честь Джорджа Буля , который впервые определил алгебраическую систему логики в середине 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.
), логично IF
оператор, логические операторы числового сравнения ( .EQ.
, .GT.
и т. д.) и логические операторы ( .NOT.
, .AND.
, .OR.
, .EQV.
, и .NEQV.
). В FORMAT
операторы, определенный дескриптор формата (' L
') предназначен для анализа или форматирования логических значений. [4]
Лисп и схема [ править ]
Язык Лисп (1958 г.) никогда не имел встроенного логического типа данных. Вместо этого условные конструкции типа cond
предположим, что логическое значение false представлено пустым списком ()
, который определяется как специальный атом nil
или NIL
; тогда как любое другое s-выражение интерпретируется как истинное . Для удобства в большинстве современных диалектов Лиспа атом заранее определен. t
иметь ценность t
, так что t
может использоваться как мнемоническое обозначение true .
Этот подход ( в качестве логического значения может быть использовано любое значение ) сохранился в большинстве диалектов Лиспа ( Common Lisp , Scheme , Emacs Lisp ), и подобные модели были приняты многими языками сценариев , даже теми, которые имели отдельный логический тип или логические значения; хотя какие значения интерпретируются как ложные , а какие истинные, варьируются от языка к языку. Например, в Scheme значение false — это атом, отличный от пустого списка, поэтому последний интерпретируется как true . С другой стороны, Common Lisp также предоставляет выделенную boolean
тип, полученный как специализация символа. [5]
Паскаль, Ада и Хаскелл [ править ]
Язык Паскаль (1970) популяризировал концепцию определяемых программистом перечислимых типов , ранее доступных с различной номенклатурой в COBOL , FACT и JOVIAL . Встроенный Boolean
тип данных затем был предоставлен как предопределенный перечислимый тип со значениями FALSE
и TRUE
. По определению, все сравнения, логические операции и условные операторы, применяемые к и/или выдающие Boolean
ценности. В противном случае Boolean
type имел все возможности, которые были доступны для перечислимых типов в целом, такие как упорядочивание и использование в качестве индексов. Напротив, преобразование между Boolean
s и целые числа (или любые другие типы) по-прежнему требовали явных тестов или вызовов функций, как в АЛГОЛе 60. Этот подход ( Boolean — перечислимый тип ) был принят большинством более поздних языков, в которых были перечисляемые типы, таких как Modula , Ada и Haskell. .
C, C++, D, Objective-C, AWK [ править ]
Первоначальные реализации языка C (1972 г.) не предоставляли логический тип, и по сей день логические значения обычно представляются целыми числами ( int
s) в программах на языке C. Операторы сравнения ( >
, ==
и т. д.) определены для возврата целого числа со знаком ( int
) результат: 0 (ложь) или 1 (истина). Логические операторы ( &&
, ||
, !
и т. д.) и операторы проверки условий ( if
, while
) предположим, что ноль — ложь, а все остальные значения — истина.
После перечислимых типов ( enum
s) были добавлены в (1989) Американского национального института стандартов версию C, ANSI C , многие программисты C привыкли определять свои собственные логические типы как таковые из соображений удобства чтения. Однако согласно стандартам языка перечислимые типы эквивалентны целым числам; поэтому эффективное тождество между логическими и целыми числами по-прежнему справедливо для программ на языке C.
Стандарт C (начиная с C99 ) предоставляет логический тип, называемый _Bool
. Включив заголовок stdbool.h
, можно использовать более интуитивное имя bool
и константы true
и false
. Язык гарантирует, что любые два истинных значения будут сравниваться равными (чего было невозможно достичь до введения типа). Логические значения по-прежнему ведут себя как целые числа, могут храниться в целочисленных переменных и использоваться везде, где допустимы целые числа, в том числе при индексировании, арифметике, синтаксическом анализе и форматировании. Этот подход ( логические значения — это просто целые числа ) был сохранен во всех более поздних версиях C. Обратите внимание, что это не означает, что любое целочисленное значение может быть сохранено в логической переменной.
В C++ есть отдельный тип данных Boolean. bool
, но с автоматическими преобразованиями из скалярных значений и значений указателей, которые очень похожи на преобразования в C. Этот подход был принят также во многих более поздних языках, особенно в некоторых языках сценариев, таких как AWK .
Язык программирования D имеет правильный логический тип данных. bool
. bool
type — это тип размером в байт, который может содержать только значения true или false.
Единственные операторы, которые могут принимать операнды типа bool: &, |, ^, &=, |=, ^=, !, &&, || и ?:.
А bool
значение может быть неявно преобразовано в любой целочисленный тип, при этом значение false становится равным 0, а значение true — 1.
Числовые литералы 0 и 1 могут быть неявно преобразованы в логические значения false и true соответственно. Приведение выражения к bool
означает проверку на 0 или !=0 для арифметических типов и на ноль или !=null для указателей или ссылок.
Objective-C также имеет отдельный логический тип данных. BOOL
, с возможными значениями YES
или NO
, эквиваленты true и false соответственно. [6] Кроме того, в компиляторах Objective-C, поддерживающих C99, C _Bool
type можно использовать, поскольку Objective-C является надмножеством C.
Ява [ править ]
В Java значение boolean
тип данных может быть только true
или false
. [7]
Перл и Lua [ править ]
В Perl нет логического типа данных. Вместо этого любое значение может вести себя как логическое значение в логическом контексте (условие if
или while
утверждение, аргумент &&
или ||
, и т. д.). Число 0
, струны "0"
и ""
, пустой список ()
, и особое значение undef
оценить как ложь. [8] Все остальное оценивается как true.
Lua имеет логический тип данных, но нелогические значения также могут вести себя как логические значения. Неценность nil
оценивается как false, тогда как значение любого другого типа данных оценивается как true. Сюда входит пустая строка ""
и число 0
, которые очень часто считают false
на других языках.
ПЛ/И [ править ]
PL/I не имеет логического типа данных. Вместо этого операторы сравнения генерируют значения BIT(1); '0'B представляет ложь , а '1'B представляет истину . Операнды, например, &
, |
, ¬
, преобразуются в битовые строки, и операции выполняются над каждым битом. Элемент - выражение IF
утверждение истинно, если какой-либо бит равен 1.
Рекс [ править ]
Rexx не имеет логического типа данных. Вместо этого операторы сравнения генерируют 0 или 1; 0 представляет ложь , а 1 представляет истину . Операнды, например, &
, |
, ¬
, должно быть 0 или 1.
ТКЛ [ править ]
Tcl не имеет отдельного логического типа. Как и в C, используются целые числа 0 (ложь) и 1 (истина — фактически любое ненулевое целое число). [9]
Примеры кодирования:
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
, стандартный целочисленный тип. [10] Он имеет два возможных значения: True
и False
, которые являются специальными версиями 1 и 0 соответственно и ведут себя соответствующим образом в арифметическом контексте. Кроме того, числовое значение нуля (целое или дробное), нулевое значение ( None
), пустая строка и пустые контейнеры (списки, наборы и т. д.) считаются логическими значениями false; все остальные значения по умолчанию считаются логическими истинными. [11] Классы могут определять, как их экземпляры обрабатываются в логическом контексте с помощью специального метода. __nonzero__
(Питон 2) или __bool__
(Питон 3). Для контейнеров, __len__
(специальный метод определения длины контейнеров) используется, если не определен явный логический метод преобразования.
В Ruby , напротив, только nil
(нулевое значение Ruby) и специальный false
объект ложный ; все остальное (включая целое число 0 и пустые массивы) истинно .
В JavaScript пустая строка ( ""
), null
, undefined
, NaN
, +0, −0 и false
[12]
иногда называются ложными которых ( дополнением является true ), чтобы различать логические значения со строгой проверкой типов и принудительные логические значения. [13] В отличие от Python, пустые контейнеры (массивы, карты, наборы) считаются правдивыми. Такие языки, как PHP, также используют этот подход.
SQL [ править ]
Логические значения появляются в SQL, когда необходимо условие , например Предложение WHERE в форме предиката, который создается с помощью таких операторов, как операторы сравнения, IN , оператор IS (NOT) NULL и т. д. Однако, кроме ПРАВДА и FALSE эти операторы также могут возвращать третье состояние, называемое НЕИЗВЕСТНО , при сравнении с NULL
сделано.
Представлен стандарт SQL92 ЕСТЬ (НЕ) ПРАВДА, ЕСТЬ (НЕ) ЛОЖЬ и Операторы IS (NOT) UNKNOWN , которые оценивают предикат, который появился до введения логического типа в SQL:1999 .
Стандарт SQL:1999 представил Тип данных BOOLEAN как дополнительная функция (T031). При ограничении Ограничение NOT NULL , SQL BOOLEAN ведет себя как логические значения в других языках, которые могут хранить только ПРАВДА и ЛОЖНЫЕ ценности. Однако, если он допускает значение NULL, что является значением по умолчанию, как и все другие типы данных SQL, он также может иметь специальное значение NULL. Хотя стандарт SQL определяет три литерала для БУЛЕВЫЙ тип – ИСТИНА, ЛОЖЬ и НЕИЗВЕСТНО — здесь также говорится, что НУЛЬ БУЛЕВОЕ и НЕИЗВЕСТНО «может использоваться взаимозаменяемо и означать одно и то же». [14] [15] Это вызвало некоторые разногласия, поскольку субъекты идентификации НЕИЗВЕСТНО к правилам сравнения равенства для NULL. Точнее UNKNOWN = UNKNOWN
не ПРАВДА , но НЕИЗВЕСТНО/НОЛЬ . [16] По состоянию на 2012 год лишь немногие основные системы SQL реализуют функцию T031. [17] Firebird и PostgreSQL являются заметными исключениями, хотя PostgreSQL не реализует НЕИЗВЕСТНЫЙ литерал; NULL
вместо этого можно использовать. [18]
Обработка логических значений различается в разных системах SQL.
Например, в Microsoft SQL Server логическое значение вообще не поддерживается ни как отдельный тип данных, ни как целое число. Он показывает сообщение об ошибке «Выражение нелогического типа, указанное в контексте, где ожидается условие», если столбец напрямую используется в Предложение WHERE , например SELECT a FROM t WHERE a
, в то время как такое утверждение, как 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
для преобразования между целочисленным и логическим выражением.
Microsoft Access , использующий ядро базы данных Access (ACE/JET), [19] также не имеет логического типа данных. Подобно MS SQL Server, он использует BIT . Тип данных [20] В Access он известен как тип данных «Да/Нет». [21] который может иметь два значения; Да (Правда) или Нет (Ложь). Тип данных BIT в Access также может быть представлен в числовом виде; Истина равна −1, а Ложь равна 0. [22] Он отличается от MS SQL Server двумя способами, хотя оба являются продуктами Microsoft:
- Доступ представляет собой TRUE как −1, тогда как в SQL Server оно равно 1.
- Access не поддерживает три состояния Null, поддерживаемые SQL Server.
PostgreSQL имеет отличительную особенность BOOLEAN тип, как в стандарте, [23] который позволяет хранить предикаты непосредственно в BOOLEAN- столбец и позволяет использовать BOOLEAN- столбец непосредственно в качестве предиката в Пункт ГДЕ .
В MySQL , BOOLEAN рассматривается как псевдоним TINYINT(1)
; [24] TRUE совпадает с целым числом 1 и ЛОЖЬ — это то же самое, что и целое число 0. [25] Любое ненулевое целое число истинно в условиях.
Таблица [ править ]
Программное обеспечение Tableau имеет тип данных BOOLEAN. [26] Литерал логического значения: True
или False
. [27]
Таблица INT()
Функция преобразует логическое значение в число, возвращая 1 для True и 0 для False. [28]
Далее [ править ]
Форт (язык программирования) не имеет логического типа, он использует обычные целые числа: значение 0 (все младшие биты) представляет ложь, а -1 (все старшие биты) представляет истину. Это позволяет языку определять только один набор логических операторов вместо одного для математических вычислений и одного для условий. [29]
См. также [ править ]
- Булево дифференциальное исчисление
- Флаг (программирование)
- Расширение Шеннона
- Трехзначная логика
- True и false (команды) для сценариев оболочки
Ссылки [ править ]
- ^ Керниган, Брайан В .; Ричи, Деннис М (1978). Язык программирования C (1-е изд.). Энглвуд Клиффс, Нью-Джерси : Прентис Холл . п. 41 . ISBN 0-13-110163-3 .
- ^ Плаугер, Пи Джей ; Броди, Джим (1992) [1989]. Справочник программиста C по стандартам ANSI и ISO . Майкрософт Пресс . стр. 86–93 . ISBN 1-55615-359-7 .
- ^ «Отчет об алгоритмическом языке АЛГОЛ 68, раздел 10.2.2» (PDF) . Август 1968 года. Архивировано (PDF) из оригинала 6 апреля 2008 года . Проверено 30 апреля 2007 г.
- ^ Digital Equipment Corporation, Справочное руководство для программистов DECSystem10 FORTRAN IV . Перепечатано в Справочнике по математическим языкам . Онлайн-версия. Архивировано 14 августа 2011 г. на Wayback Machine, доступ осуществлен 16 ноября 2011 г.
- ^ «CLHS: Тип BOOLEAN» .
- ^ «Руководства и пример кода» . разработчик.apple.com . Архивировано из оригинала 7 сентября 2011 года . Проверено 1 мая 2018 г.
- ^ «Явские логические значения» . Интернет-руководства 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 г.
- ^ С. Дата (2011). SQL и реляционная теория: как писать точный код SQL . О'Рейли Медиа, Инк. с. 83. ИСБН 978-1-4493-1640-2 .
- ^ ИСО/МЭК 9075-2:2011 §4.5
- ^ Мартин Пригмор (2007). Введение в базы данных с веб-приложениями . Пирсон Образования Канады. п. 197. ИСБН 978-0-321-26359-9 .
- ^ Троэлс Арвин, Обзор реализации типа данных BOOLEAN. Архивировано 9 марта 2005 г. на Wayback Machine.
- ^ «PostgreSQL: Документация: 10: 8.6. Логический тип» . www.postgresql.org . Архивировано из оригинала 9 марта 2018 года . Проверено 1 мая 2018 г.
- ^ «Миграция базы данных Access на SQL Server» . support.microsoft.com . Проверено 19 октября 2020 г.
- ^ о365devx. «Типы данных SQL (Справочник по базе данных Access Desktop)» . docs.microsoft.com . Проверено 19 октября 2020 г.
{{cite web}}
: CS1 maint: числовые имена: список авторов ( ссылка ) - ^ «Введение в типы данных и свойства полей» . support.microsoft.com . Проверено 19 октября 2020 г.
- ^ «Логические данные — Учебное пособие по MS-Access» . sourcedaddy.com . Проверено 19 октября 2020 г.
- ^ «Булев тип» . 27 октября 2016 г.
- ^ «MySQL :: Справочное руководство MySQL 8.0 :: 12.1.1 Обзор числовых типов» . dev.mysql.com . Архивировано из оригинала 22 сентября 2016 г.
- ^ «MySQL :: Справочное руководство MySQL 8.0 :: 9.1.6 Логические литералы» . dev.mysql.com .
- ^ «Типы данных» . help.tableau.com . Проверено 19 октября 2020 г.
- ^ «Форматирование вычислений в таблице» . help.tableau.com . Проверено 19 октября 2020 г.
- ^ «Boolean делает Tableau быстрее — правда или ложь?» . ТАР Решения . 11 сентября 2020 г. Проверено 19 октября 2020 г.
- ^ «4. Решения, решения...» Forth Inc. 11 февраля 2022 г. Проверено 11 февраля 2022 г.