Логический тип: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
Нет описания правки
уточнение, дополнение, стилевые правки, оформление, викификация
Строка 1: Строка 1:
{{другое значение|По [[Википедия:Именование статей/Технические ограничения|техническим причинам]] _Bool перенаправляется сюда. О _Bool можно прочитать здесь: [[stdbool.h]].}}
{{другое значение|По [[Википедия:Именование статей/Технические ограничения|техническим причинам]] _Bool перенаправляется сюда. О _Bool можно прочитать здесь: [[stdbool.h]].}}


'''Логический''', булев ({{lang-en|Boolean}} или ''logical data type'') тип данных — примитивный [[тип данных]] в [[информатика|информатике]], который может принимать два возможных значения, иногда называемых ''истиной'' (''true'') и ''ложью'' (''false''). Присутствует в подавляющем большинстве языков программирования как самостоятельная сущность или реализуется через численный тип. В подавляющем большинстве языков за истину полагается единица, за ложь — ноль.
'''Логи́ческий тип да́нных''', или булев тип, или булевый тип (от {{lang-en|Boolean}} или ''logical data type'') — примитивный [[тип данных]] в [[информатика|информатике]], принимающий два возможных значения, иногда называемых ''истиной'' (''true'') и ''ложью'' (''false''). Присутствует в подавляющем большинстве языков программирования как самостоятельная сущность или реализуется через численный тип данных. В некоторых языках программирования за значение ''истина'' полагается 1, за значение ''ложь'' — 0.


Название Boolean получило своё название в честь английского математика и логика [[Буль, Джордж|Джорджа Буля]], среди прочего, занимавшегося вопросами математической логики в середине [[XIX век|19 века]].
Название типа 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>&gt;</code>, <code>&lt;</code>, <code>&lt;=</code>, <code>&gt;=</code>)
* ''сравнение'' (<code>&gt;</code>, <code>&lt;</code>, <code>&lt;=</code>, <code>&gt;=</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/False.
Для других объектов результат рассчитывается через метод ''__nonzero__'', который в идеале должен возвращать значения True или False.


Булев тип приводится к следующим типам данных:
Булев тип приводится к следующим типам данных:
* строковый: 'True' для истины, 'False' для лжи.
* строковый: 'True' для истины, 'False' для лжи;
* числовой (встроенные типы int, long, float): 1 для истины, 0 для лжи.
* числовой (встроенные типы int, long, float): 1 для истины, 0 для лжи.


К другим типам данных булев тип не приводится.
К другим типам данных булев тип не приводится.


В [[Python]] 2.6 есть интересная особенность — можно переопределить значение True на False и наоборот, написав всего лишь
В [[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 данная возможность была ликвидирована — True и False считаются зарезервированными, как и слово None.
что может привести к весьма неожиданному поведению интерпретатора или 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.
Арифметические операции над булевыми недопустимы, но допустимы логические операции: 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» или пустая строка, что часто является неожиданностью для новичков.

См. также