Логический тип: различия между версиями
[непроверенная версия] | [отпатрулированная версия] |
Нет описания правки |
Д.Ильин (обсуждение | вклад) уточнение, дополнение, стилевые правки, оформление, викификация |
||
Строка 1: | Строка 1: | ||
{{другое значение|По [[Википедия:Именование статей/Технические ограничения|техническим причинам]] _Bool перенаправляется сюда. О _Bool можно прочитать здесь: [[stdbool.h]].}} |
{{другое значение|По [[Википедия:Именование статей/Технические ограничения|техническим причинам]] _Bool перенаправляется сюда. О _Bool можно прочитать здесь: [[stdbool.h]].}} |
||
''' |
'''Логи́ческий тип да́нных''', или булев тип, или булевый тип (от {{lang-en|Boolean}} или ''logical data type'') — примитивный [[тип данных]] в [[информатика|информатике]], принимающий два возможных значения, иногда называемых ''истиной'' (''true'') и ''ложью'' (''false''). Присутствует в подавляющем большинстве языков программирования как самостоятельная сущность или реализуется через численный тип данных. В некоторых языках программирования за значение ''истина'' полагается 1, за значение ''ложь'' — 0. |
||
Название Boolean получило |
Название типа Boolean получило в честь английского математика и логика [[Буль, Джордж|Джорджа Буля]], среди прочего, занимавшегося вопросами математической логики в середине [[XIX век|19 века]]. |
||
== Реализация == |
== Реализация == |
||
Булев тип данных может быть реализован с использованием только одного [[бит]]а, но обычно используется минимальная адресуемая ячейка памяти ([[байт]] |
Булев тип данных может быть реализован и храниться в памяти с использованием только одного [[бит]]а, но обычно используется минимальная адресуемая ячейка памяти (обычно [[байт]] или [[машинное слово]]), как более эффективная с точки зрения быстродействия единица хранения при работе с [[Регистр процессора|регистрами процессора]] и [[Оперативная память|оперативной памятью]]. |
||
== Доступные операции == |
== Доступные операции с этим типом данных == |
||
К этому типу данных применимы следующие операции: |
К этому типу данных применимы следующие операции, в скобках указаны символические обозначения операций в некоторых популярных языках программирования: |
||
* ''И'' (логическое умножение) (<code>AND</code>, <code>&</code>, <code>*</code>), |
* ''И'' (логическое умножение) (<code>AND</code>, <code>&</code>, <code>*</code>), |
||
* ''ИЛИ'' (логическое сложение) (<code>OR</code>, <code>|</code>, <code>+</code>), |
* ''ИЛИ'' (логическое сложение) (<code>OR</code>, <code>|</code>, <code>+</code>), |
||
Строка 17: | Строка 17: | ||
* ''сравнение'' (<code>></code>, <code><</code>, <code><=</code>, <code>>=</code>) |
* ''сравнение'' (<code>></code>, <code><</code>, <code><=</code>, <code>>=</code>) |
||
Также могут использоваться и другие операции [[Булева алгебра|булевой алгебры]], например, [[стрелка Пирса]] или [[штрих Шеффера]]. Большинство языков программирования позволяют использовать булев тип переменных и констант и в арифметических операциях, предварительно приводя его к численному типу, согласно принятым в языке правилам преобразования типов. |
|||
== Применение == |
== Применение == |
||
Традиционным применением булева типа данных являются значения «да»/«нет» в отношении результата более сложных |
Традиционным применением булева типа данных являются значения «да»/«нет» в отношении результата сравнение чисел в более сложных операциях. |
||
Все операции сравнения двух величин (равно, больше, меньше), |
Все операции сравнения двух величин — вещественных и целых переменных или константы с переменной (равно, больше, меньше), функции проверки принадлежности вхождения некоторого элемента в множество и проверка на непустоту пересечения множеств возвращают в качестве результата булев тип. |
||
== Реализация в различных языках программирования == |
== Реализация в различных языках программирования == |
||
Строка 44: | Строка 44: | ||
=== C === |
=== C === |
||
В [[Си (язык программирования)|языке программирования C]], который не предоставлял булевых значений в [[Си (язык программирования)#ANSI C и ISO C|C89]] (но вводит в [[Си (язык программирования)#C99|C99]]) вместо значений true/false было установлено сравнение значения с нулём. Для примера, код |
В [[Си (язык программирования)|языке программирования C]], который не предоставлял булевых значений в [[Си (язык программирования)#ANSI C и ISO C|C89]] (но вводит в [[Си (язык программирования)#C99|C99]]) вместо значений true/false было установлено сравнение значения с нулём. Для примера, код: |
||
<source lang='c'> |
<source lang='c'> |
||
Строка 51: | Строка 51: | ||
</source> |
</source> |
||
равнозначен коду |
равнозначен коду: |
||
<source lang='c'> |
<source lang='c'> |
||
Строка 72: | Строка 72: | ||
=== Python === |
=== Python === |
||
В языке [[Python]] булев тип данных обозначается как <code>bool</code>, для приведения других типов данных к булеву существует функция <code>bool()</code>, работающая по следующим соглашениям: |
В языке [[Python]] булев тип данных обозначается как <code>bool</code>, для приведения других типов данных к булеву существует функция <code>bool()</code>, работающая по следующим соглашениям: |
||
* строки: пустая строка — ложь, непустая строка истина |
* строки: пустая строка — ложь, непустая строка истина; |
||
* числа: нулевое число — ложь, ненулевое число (в том числе и меньшее единицы) — истина |
* числа: нулевое число — ложь, ненулевое число (в том числе и меньшее единицы) — истина; |
||
* списки и кортежи: пустой список (кортеж) — ложь, непустой (даже содержащий один элемент, например пустой кортеж) — истина |
* списки и кортежи: пустой список (кортеж) — ложь, непустой (даже содержащий один элемент, например пустой кортеж) — истина; |
||
* функции — всегда истина. |
* функции — всегда истина. |
||
Для других объектов результат рассчитывается через метод __nonzero__, который в идеале должен возвращать значения True |
Для других объектов результат рассчитывается через метод ''__nonzero__'', который в идеале должен возвращать значения True или False. |
||
Булев тип приводится к следующим типам данных: |
Булев тип приводится к следующим типам данных: |
||
* строковый: 'True' для истины, 'False' для лжи |
* строковый: 'True' для истины, 'False' для лжи; |
||
* числовой (встроенные типы int, long, float): 1 для истины, 0 для лжи. |
* числовой (встроенные типы int, long, float): 1 для истины, 0 для лжи. |
||
К другим типам данных булев тип не приводится. |
К другим типам данных булев тип не приводится. |
||
В [[Python]] 2.6 есть интересная особенность |
В [[Python]] 2.6 есть интересная особенность — можно переопределить значение True на False и наоборот, написав всего лишь: |
||
<source lang='python'> |
<source lang='python'> |
||
True = False |
True = False |
||
Строка 93: | Строка 94: | ||
__builtins__.True = False |
__builtins__.True = False |
||
</source> |
</source> |
||
что может привести к весьма неожиданному поведению интерпретатора или IDLE. В python 3 данная возможность была ликвидирована |
что может привести к весьма неожиданному поведению интерпретатора или IDLE. В python 3 данная возможность была ликвидирована — True и False считаются зарезервированными, как и слово None. |
||
=== Pascal === |
=== Pascal === |
||
Описание переменных: |
Описание переменных: |
||
<source lang='pascal'> |
<source lang='pascal'> |
||
var a, b : Boolean |
var a, b : Boolean |
||
</source> |
</source> |
||
Арифметические операции над булевыми недопустимы, но допустимы логические операции: Not, And, Or, Xor, операции отношения = (равно), <> (не равно) и функции Ord, Pred, Succ. |
|||
<source lang='pascal'> |
<source lang='pascal'> |
Версия от 13:30, 6 января 2016
Логи́ческий тип да́нных, или булев тип, или булевый тип (от англ. Boolean или logical data type) — примитивный тип данных в информатике, принимающий два возможных значения, иногда называемых истиной (true) и ложью (false). Присутствует в подавляющем большинстве языков программирования как самостоятельная сущность или реализуется через численный тип данных. В некоторых языках программирования за значение истина полагается 1, за значение ложь — 0.
Название типа Boolean получило в честь английского математика и логика Джорджа Буля, среди прочего, занимавшегося вопросами математической логики в середине 19 века.
Реализация
Булев тип данных может быть реализован и храниться в памяти с использованием только одного бита, но обычно используется минимальная адресуемая ячейка памяти (обычно байт или машинное слово), как более эффективная с точки зрения быстродействия единица хранения при работе с регистрами процессора и оперативной памятью.
Доступные операции с этим типом данных
К этому типу данных применимы следующие операции, в скобках указаны символические обозначения операций в некоторых популярных языках программирования:
- И (логическое умножение) (
AND
,&
,*
), - ИЛИ (логическое сложение) (
OR
,|
,+
), - исключающее ИЛИ (сложение с переносом) (
xor
,NEQV
,^
), - эквивалентность (равенство) (
EQV
,=
,==
) - инверсия (
NOT
,~
,!
) - сравнение (
>
,<
,<=
,>=
)
Также могут использоваться и другие операции булевой алгебры, например, стрелка Пирса или штрих Шеффера. Большинство языков программирования позволяют использовать булев тип переменных и констант и в арифметических операциях, предварительно приводя его к численному типу, согласно принятым в языке правилам преобразования типов.
Применение
Традиционным применением булева типа данных являются значения «да»/«нет» в отношении результата сравнение чисел в более сложных операциях.
Все операции сравнения двух величин — вещественных и целых переменных или константы с переменной (равно, больше, меньше), функции проверки принадлежности вхождения некоторого элемента в множество и проверка на непустоту пересечения множеств возвращают в качестве результата булев тип.
Реализация в различных языках программирования
Ada
Язык программирования Ada определяет Boolean
в пакете Standard как нумерованный тип со значениями False
и True
в котором False
< True
.
type Boolean is (False, True);
p : Boolean := True;
if p then
...
end if;
Родственные операторы (=
, /=
, <
, <=
, >
, >=
) применяются ко всем нумерованым типам, включая Boolean
. Булевы операторы and
, or
, xor
и not
применимы к типу Boolean
и любым объявленным подтипам. Булевы операторы также применимы к массивам, содержащим значения Boolean
.
Algol
Algol 60 имеет тип данных boolean
и соответствующие операторы, установленные в спецификации Algol 60. Тип данных был сокращён до bool
в ALGOL 68.
C
В языке программирования C, который не предоставлял булевых значений в C89 (но вводит в C99) вместо значений true/false было установлено сравнение значения с нулём. Для примера, код:
if (bool_variable) printf("True!\n");
else printf("False!\n");
равнозначен коду:
if (bool_variable != 0) printf("True!\n");
else printf("False!\n");
Это было честно для целочисленного типа данных (integer); тем не менее, бинарные значения чисел с плавающей запятой (floating-point) были приближёнными к выводимым на экран десятичным значениям и это давало ошибки при сравнении. Традиционно, целое содержало одну (или более) булеву переменную (одну на каждый разряд целого).
Haskell
В языке Haskell булев тип данных реализован как простейший алгебраический тип данных:
data Bool = False | True
В стандартном модуле Data.Bool
для него определены функции &&
, ||
и not
.
Python
В языке Python булев тип данных обозначается как bool
, для приведения других типов данных к булеву существует функция bool()
, работающая по следующим соглашениям:
- строки: пустая строка — ложь, непустая строка истина;
- числа: нулевое число — ложь, ненулевое число (в том числе и меньшее единицы) — истина;
- списки и кортежи: пустой список (кортеж) — ложь, непустой (даже содержащий один элемент, например пустой кортеж) — истина;
- функции — всегда истина.
Для других объектов результат рассчитывается через метод __nonzero__, который в идеале должен возвращать значения True или False.
Булев тип приводится к следующим типам данных:
- строковый: 'True' для истины, 'False' для лжи;
- числовой (встроенные типы int, long, float): 1 для истины, 0 для лжи.
К другим типам данных булев тип не приводится.
В Python 2.6 есть интересная особенность — можно переопределить значение True на False и наоборот, написав всего лишь:
True = False
или, вариант для всей области видимости
__builtins__.True = False
что может привести к весьма неожиданному поведению интерпретатора или IDLE. В python 3 данная возможность была ликвидирована — True и False считаются зарезервированными, как и слово None.
Pascal
Описание переменных:
var a, b : Boolean
Арифметические операции над булевыми недопустимы, но допустимы логические операции: Not, And, Or, Xor, операции отношения = (равно), <> (не равно) и функции Ord, Pred, Succ.
var
A, B: Byte;
C, D, E, F: Boolean;
begin
A := Ord(False); {A=0}
B := Ord(True); {B=1}
C := Pred(False); {ошибка}
D := Pred(True); {D=False}
E := Succ(False); {E=True}
F := Succ(True); {ошибка}
end.
Ruby
В Ruby булев тип представлен двумя предопределенными переменными: true
и false
. Появляется логический тип в результате логических операций или вызова логических методов. По традиции, имя логических методов (то есть методов, которые возвращают значение true или false) заканчивается на «?».
В качестве false
может выступать nil
, а в качестве true
— любой объект, в том числе переменная со значением «0» или пустая строка, что часто является неожиданностью для новичков.