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

редактировать

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

Содержание

  • 1 Общие положения
  • 2 Алгол и встроенный логический тип
  • 3 Фортран
  • 4 Лисп и схема
  • 5 Паскаль, Ада и Хаскель
  • 6 C, C ++, Objective-C, AWK
  • 7 Perl и Lua
  • 8 Tcl
  • 9 Python, Ruby и JavaScript
  • 10 Оболочка следующего поколения
  • 11 SQL
  • 12 Таблица
  • 13 См. также
  • 14 Ссылки

Общие положения

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

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

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

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

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

АЛГОЛ и встроенный логический тип

Одним из первых языков программирования, предоставляющих явный логический тип данных, является АЛГОЛ 60 (1960) со значениями true и false и логические операторы, обозначенные символами '∧ {\ displaystyle \ wedge}\ wedge ' (и), '∨ {\ displaystyle \ vee}\ vee ' (или), '⊃ {\ displaystyle \ supset}\ supset ' (подразумевает), '≡ {\ displaystyle \ Equiv}\ Equiv ' (эквивалентность) и '¬ {\ displaystyle \ neg}\ neg '(не). Однако из-за устройства ввода и ограничения набора символов на многих компьютерах того времени большинство компиляторов использовали альтернативные представления для многих операторов, такие как ANDили 'AND'.

Этот подход со встроенным логическим значением (либо примитивом, либо иным предопределенным) типом данных был принят во многих более поздних языках программирования, таких как Simula 67 (1967), АЛГОЛ 68 (1970), Паскаль (1970), Ada (1980), Java (1995), и C # (2000), среди прочего.

Fortran

Первая версия FORTRAN (1957) и ее преемник FORTRAN II (1958) не имеют логических значений или операций; даже условный оператор IFпринимает арифметическое выражение и переходит в одно из трех мест в соответствии с его знаком; см. арифметический IF. FORTRAN IV (1962), однако, следует примеру АЛГОЛА 60, предоставляя логический тип данных (LOGICAL), литералы истинности (.TRUE.и .FALSE.), Логические операторы сравнения чисел (.EQ., .GT.и т. Д.) И логические операторы (.NOT., .И., .ИЛИ). В операторах FORMATконкретный дескриптор формата ('L') предоставляется для синтаксического анализа или форматирования логических значений.

Lisp и Scheme

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

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

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

В языке Паскаль (1970) введена концепция перечислимых типов, определяемых программистами. Затем был предоставлен встроенный тип данных Booleanкак предопределенный перечислимый тип со значениями FALSEи TRUE. По определению, все сравнения, логические операции и условные операторы применялись к и / или давали логическиезначения. В противном случае тип Booleanимел все возможности, которые были доступны для перечислимых типов в целом, такие как упорядочивание и использование в качестве индексов. Напротив, преобразование между Booleans и целыми числами (или любыми другими типами) по-прежнему требовало явных тестов или вызовов функций, как в Алголе 60. Этот подход (Boolean - это перечислимый тип) был принят в большинстве более поздних языков, которые имели перечислимые типы, такие как Modula, Ada и Haskell.

C, C ++, Objective-C, AWK

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

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

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

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

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

Perl и Lua

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

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

Tcl

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

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

установить v 1, если {$ v} {ставит "V равно 1 или истина "}

Выше будет показано" V равно 1 или истина ", поскольку выражение оценивается как '1'

set v" "if {$ v}....

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

Python, Ruby и JavaScript

Python, начиная с версии 2.3, имеет bool, который является подклассом из int, стандартного целочисленного типа. Он имеет два возможных значения: Истинаи Ложь, которые являются специальными версиями 1 и 0 соответственно и ведут себя как таковые в арифметических контекстах. Кроме того, числовое значение нуля (целое или дробное), нулевое значение (Нет), пустая строка и пустые контейнеры (т.е. списки, наборы и т. Д.) Считаются логическим ложным; все остальные значения по умолчанию считаются логическим true. Классы могут определять, как их экземпляры обрабатываются в логическом контексте с помощью специального метода __nonzero__(Python 2) или __bool__(Python 3). Для контейнеров используется __len__(специальный метод определения длины контейнеров), если не определен явный метод преобразования Boolean.

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

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

Оболочка следующего поколения

Оболочка следующего поколения, имеет тип Bool. Имеет два возможных значения: истинаи ложь. Boolне взаимозаменяем с Intи при необходимости должен быть преобразован явно. Когда требуется логическое значение выражения (например, в операторе if), вызывается метод Bool. Метод Boolдля встроенных типов определен таким образом, что он возвращает falseдля числового значения, равного нулю, значения null, пустой строки , пустые контейнеры (то есть списки, наборы и т. Д.), Внешние процессы, завершившиеся с ненулевым кодом выхода ; для других значений Boolвозвращает true. Типы, для которых определен метод Bool, можно использовать в логическом контексте. При оценке выражения в логическом контексте, если не определен подходящий метод Bool, выдается исключение.

SQL

Логические значения появляются в SQL, когда требуется условие, такое как предложение WHERE, в форме предиката, который создается с помощью таких операторов, как операторы сравнения, оператор IN, IS (NOT) NULL и т. Д. Однако, помимо TRUE и FALSE, эти операторы могут также давать третье состояние, называемое UNKNOWN, при сравнении с NULL.

Обработка логических значений отличается в разных системах 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для преобразования между целым и логическим выражением.

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

В MySQL BOOLEAN рассматривается как псевдоним как TINYINT (1), TRUE - это то же самое, что и целое число 1, а FALSE - то же самое, что целое число 0., и обрабатывает любые ненулевые целое число как истина при оценке условий.

Стандарт SQL92 представил операторы IS (NOT) TRUE, IS (NOT) FALSE, IS (NOT) UNKNOWN, которые оценивают предикат, который предшествовал введению логического типа в SQL: 1999

Стандарт SQL: 1999 представил тип данных BOOLEAN как дополнительную функцию (T031). При ограничении NOT NULLSQL BOOLEAN ведет себя как логические значения в других языках, которые могут хранить только значения TRUE и FALSE. Однако, если он допускает значение NULL, что по умолчанию, как и все другие типы данных SQL, он также может иметь специальное значение null. Хотя стандарт SQL определяет три литерала для типа BOOLEAN - TRUE, FALSE и UNKNOWN - он также говорит, что NULL BOOLEAN и UNKNOWN «могут использоваться взаимозаменяемо для обозначения одного и того же». Это вызвало некоторые споры, потому что идентификация подвергает НЕИЗВЕСТНО правилу сравнения равенства для NULL. Точнее UNKNOWN = UNKNOWN не TRUE, а UNKNOWN / NULL. По состоянию на 2012 год несколько основных систем SQL реализуют функцию T031. Firebird и PostgreSQL являются заметными исключениями, хотя PostgreSQL не реализует литерал UNKNOWN; Вместо этого можно использовать NULL.

Microsoft Access, в котором используется ядро ​​базы данных Microsoft Jet, также не имеет логического типа данных. Подобно MS SQL Server, он использует тип данных BIT. В Access он известен как тип данных «Да / Нет», который может иметь два значения; Да (верно) или нет (неверно). Тип данных BIT в Access также может быть представлен численно; Истина - -1, а ложь - 0. Это отличается от MS SQL Server двумя способами, хотя оба являются продуктами Microsoft:

  1. Access представляет ИСТИНА как -1, тогда как это 1 в SQL Server
  2. Access не поддерживает три состояния Null, поддерживаемое SQL Server

Tableau

Tableau Software имеет тип данных BOOLEAN. Литерал логического значения: Истинаили Ложь.

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

См. Также

Ссылки

Последняя правка сделана 2021-05-13 14:35:36
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте