Булев тип данни
В информатиката, булевият тип данни е тип данни, който има две възможни стойности (най-често обозначени като true и false). Предназначен е да обозначава истинните стойности в логиката и Булевата алгебра. Той е кръстен на Джордж Бул, който за първи път дефинира алгебрична система на логиката в средата на 19 век. Булевият тип данни основно се свързва с условни конструкции, които позволяват различни действия и промяна на поредността на изпълнение, в зависимост от това дали програмно-определеното булево условие се оцени като вярно или невярно. Това е специален случай на по-общ логически тип данни; логикате не винаги трябва да бъде булева.
Общи положения
[редактиране | редактиране на кода]В програмите езици, които имат вграден булев тип, каквито са Pascal и Java, условните оператори, като например >
и ≠
обикновено са дефинирани така, че да връщат булева стойност. Условните и цикличните команди могат да бъдат дефинирани да тестват изрази с булева стойност.
Езици, в които няма изрично дефиниран булев тип данни като C90 или Lisp използват други типове данни за да представят истинни стойности. Common Lisp използва празен списък вместо неистинни стойности (false), а всичко друго се оценява като истина (true). C използва целочислен тип, при който сравнителни изрази като i > j
и логически изрази, свързани с &&
(логическо и) и ||
(логическо или) имат стойност 1 когато се оценяват като истина (true) и 0 при неистина (false). В условните части на if
, while
, for
и др. всяка стойност, различна от 0, се оценява като истина. [1][2]Всъщност, всяка булева променлива може да бъде разглеждана (и имплементирана) като променлива от цифров тип, която има един-единствен бит. Това означава, че булевата променлива може да има само две стойности, 0 и 1.
Повечето програмни езици, дори и тези, които нямат вграден булев тип, поддържат операции от Булевата алгебра. Такива операции са конюнкция (AND
, &
, *
), дизюнкция (OR
, |
, +
), равенство (EQV
, =
, ==
), изключващо ‘или’ (XOR
, NEQV
, ^
, !=
) и отрицание (NOT
, ~
, !
).
В някои езици, като Ruby, Smalltalk и Alice, стойностите за „истина“ и „неистина“ принадлежат към отделни класове – съответно True
и False
– така че в тези езици няма единен Булев тип.
ALGOL и вградения булев тип
[редактиране | редактиране на кода]Един от най-ранните програмни езици, които имат вграден булев тип е ALGOL 60 (1960), който има стойности true и false, както и логическите оператори '' (и), '' (или), '' (предположение), '' (равенство), and '' (отрицание). Поради ограничения в символното кодиране и входящите устройства на компютрите от онова време, повечето компилатори са използвали алтернативно представяне за много оператори, като например AND
или ‘AND’
.
FORTRAN
[редактиране | редактиране на кода]Първата версия на FORTRAN (1957) и неговият наследник FORTRAN II (1958) не поддържат логически стойности и операции. Дори условната конструкция IF
работи с аритметичен израз и се разклонява на три възможности, в зависимост от неговия знак. FORTRAN IV (1962) следва примера на ALGOL 60 и включва булев тип данни (LOGICAL
), истинни литерали (.TRUE.
и .FALSE.
), булеви оператори за сравнение на числа (.EQ.
, .GT.
, и т.н.), както и логически оператори (.NOT.
, .AND.
, .OR.
).
Във FORMAT
конструкциите се използва специалния символ L
. [3]
Lisp and Scheme
[редактиране | редактиране на кода]Езикът Lisp (1958) никога не е имал вграден Булев тип данни. Вместо това, условни конструкции като cond
(условие) предполагат, че логическата стойност „false“ е представена с празен списък ()
, която е определена да бъде същата като специалния атом nil
или NIL
; всеки друг S-израз се тълкува като „true“. За удобство, повечето съвременни диалекти на Lisp дефинират атом t
да има стойност t
, така че може да се използва t
като мнемоническа нотация за „true“.
Този подход („всяка стойност може да се използва като булева стойност“) се задържа в повечето Lisp диалекти (Common Lisp, Scheme, Emacs Lisp) и подобни модели биват приети от много скриптови езици, дори и такива, които имат обособен Булев тип или булеви стойности; макар стойностите, които се интерпретират като „false“ и „true“ варират между различните езици. В Scheme например, „false“ стойност е атом, различен от празен списък, така че последният се тълкува като „true“.
Pascal, Ada и Haskell
[редактиране | редактиране на кода]Езикът Pascal (1970 г.) въвежда концепцията за дефинирани от програмиста изброими типове. По-късно е въведен вграден Boolean
тип данни като предефиниран изброим тип, със стойности FALSE
и TRUE
. По дефиниция всички сравнения, логически операции и условни конструкции са приложими към и/или имат за резултат Boolean
стойности. Boolean
типа има всички удобства, които са на разположение за изброими видове като цяло – като подредба и използване на индекси. От друга страна, превръщането между Boolean
и целочислени стойности (или всякакви други видове) все още изискват изрични тестове или извиквания на функции, както в ALGOL 60. Този подход („Булевият тип е изброим тип“) е приета от повечето по-нови езици, които имат изброими типове, като например Modula, Ada и Haskell.
C, C++, Objective-C, AWK, Perl
[редактиране | редактиране на кода]Първите имплементации на езика C (1972) не са предоставяли Булев тип. Булевите стойности обикновено са представят от цели числа (int
) в програмите на С. Оперантите за сравнение (>
, ==
и т.н.) са дефинирани така, че да връщат целочислена стойност (int
) като резултат, а именно 0 (за „false“) или 1 (за „true“). Логическите оператори (&&
, ||
, !
, и т.н.) и условните изрази (if
, while
) предполагат, че нулата е „false“ и всички други стойности са „true“. Един от проблемите с този подход е, че тестовете като if (t == true)
и if (t)
не са еквивалентни.
След като добавени изброените типове (enum
) към ANSI версия на C (1989), много програмисти на C свикнат да определят техните собствени булеви типове като такива, от съображения за четивността. Въпреки това, изброени видове са еквивалентни числа съгласно стандартите на езика, така че ефективната идентичност между Булев тип и числа все още е валидна за програмите на С.
„Standard C (от C99) осигурява булев тип, наречен _Bool
. Чрез включването на заглавната stdbool.h
може да се използва за по-удобно името bool
и константите true
и false
. Езикът гарантира, че всеки две истински стойности ще сравняват еднакво (което е невъзможно да се постигне преди въвеждането на вида). Булевите стойности все още се държат като цели числа, могат да се съхраняват в целочислени променливи и се използвани навсякъде числа ще бъдат валидни, включително в индексирането, аритметика, разбор, и форматиране. Този подход („булеви стойности са само числа“) е бил задържан във всички по-късни версии на C.
C++ има отделен Булев тип данни, но с автоматични конверсии от скаларни и показалецът? на стойности, които са много сходни с тези на C. Този подход е приет и от много от по-новите, особено от някои скриптови такива като AWK.
Objective-C също има отделен Булев тип данни BOOL
, с възможни стойности са YES
и NO
, еквиваленти съответно на true и false. [4] В допълнение, в Objective-C компилатори, които поддържат C99, може да се използва _Bool
типа от C (тъй Objective-C е надмножество на C).
В еизка Perl, числото 0
, символните низове ”0”
и ””
, празният списък ()
и специалната стойност undef
се оценяват като false в булев контекст. [5] Всяка друга стойност се оценява като true.
Python, Ruby и JavaScript
[редактиране | редактиране на кода]В Python, от версия 2.3 нататък, има bool
тип, който е подклас на int
. [6] Той има две възможни стойности: True
и False
, които са „специални версии“ съответно на числата 1 и 0 и имат поведение на такива в аритметичен контекст. В допълнение, нулева стойност (целочислена или дробна), стойността null (None
), празният символен низ, както и празните колекции (пр. списъци, сетове и др.), се възприемат като булевата стойност false; всяка друга стойност се счита за true по подразбиране. [7] Класовете могат да дефинират как да се тълкуват техните инстанции в булев контекст чрез специален метод __nonzero__
(Python 2) или __bool__
(Python 3). При колекциите се използва __len__
(специалният метод, който определя дължината на колекцията), ако не е дефинирам експлицитния метод за булева конверсия.
От друга страна, в Ruby, само nil
(отсъствието на стойност в Ruby), както и специалният обект false
се възприемат като „false“. Всяка друга стойност (включително целочислена 0 и празните масиви) се счита за „true“.
В JavaScript, празният символен низ (""
), null
, undefined
, NaN
, +0, -0 и false
[8] понякога се наричат „falsy“ (грешни), а техните противоположности „truthy“ (истинни), като по този начин се прави разликата между вградените и конвертираните булеви стойности. [9] Някои езици, като PHP също използват този подход.
Източници
[редактиране | редактиране на кода]- ↑ Kernighan, Brian W, Ritchie, Dennis M. The C Programming Language. 1st. Englewood Cliffs, NJ, Prentice Hall, 1978. с. 41.
- ↑ Plauger, PJ, Brodie, Jim. ANSI and ISO Standard C Programmer's reference. Microsoft Press, 1992, [1989]. с. 86 – 93.
- ↑ Digital Equipment Corporation, DECSystem10 FORTRAN IV Programmers Reference Manual. Reprinted in Mathematical Languages Handbook. Online version Посетен на 16 ноември 2011.
- ↑ developer.apple.com
- ↑ perlsyn – Perl Syntax / Truth and Falsehood // Посетен на 10 септември 2013.
- ↑ Van Rossum, Guido. PEP 285 -- Adding a bool type // 3 април 2002. Посетен на 15 май 2013.
- ↑ Expressions // Python v3.3.2 documentation. Посетен на 15 май 2013.
- ↑ ECMAScript Language Specification // с. 43.
- ↑ The Elements of JavaScript Style // Douglas Crockford. Посетен на 5 март 2011.