From Wikipedia, the free encyclopedia
У рачунарској науци, Булов тип података је тип података, који има две вредности (обично означене као тачно и нетачно). Он показује истинитосну вредност логике и Булове алгебре. Добио је име по Џорџу Булу, који је први дефинисао алгебарски систем логике средином деветнаестог века. Логички тип података је пре свега повезан са условним изјавама, које омогућавају различите акције и које мењају контролу тока у зависности од тога да ли програмски наведен логички услов има вредност тачно или нетачно. То је специјалан случај логичког типа података; логика не мора увек да буде Булова.
Код програмских језика који имају уграђен Булов тип података, нпр. код Паскала и Јаве, оператори поређења као што су >
и ≠
се обично дефинишу тако да враћају Булову вредност. Условне и итеративне команде могу бити дефинисане тако да тестирају Булове вредносне изразе.
Језици без експлицитног Буловог типа података, као С90 и Common Lisp, и даље представљају истинитосне вредности неким другим типовима података. Lisp користи празну листу за нетачно, и било коју другу вредност за тачно. С користи интиџер тип, тамо где су поредбени изрази као i > j
и где су логички изрази повезани са &&
и ||
дефинисани тако да имају вредност 1 ако је израз тачан, а 0 ако је нетачан, док делови тестова if
, while
, for
, итд, третирају било коју вредност која није нула као тачну.[1][2] Заиста, Булова променљива се може сматрати (и бити имплементирана) као нумеричка променљива са једном бинарном цифром (битом), која може чувати само две вредности. Важно је напоменути да је имплементација булових типова у рачунарима највероватније представљена као цела реч, пре него као бит; ово је углавном због начина преноса блокова информација.
Већина програмских језика, чак и они које немају експлицитан Булов тип, имају подршку за Булове алгебарске операције као што су конјункција (AND
, &
, *
), дисјункција (OR
, |
, +
), еквиваленција (EQV
, =
, ==
) , ексклузивна или не еквиваленција (XOR
, NEQV
, ^
, !=
) и негација (NOT
, ~
, !
).
У неким језицима, као што су Руби, Smalltalk, и Алиса "тачне" и "нетачне" вредности припадају издвојеним класама—нпр True
и False
, тако да не постоји један Булов "тип".
У SQL, који користи тровредносну логику за експлицитна поређења и због свог посебног третмана Нула, булов тип података (уведен у SQL:1999) је дефинисан тако да обухвата више од две истинитосне вредности, тако да SQL'ови "булови типови" могу сачувати све логичке вредности које произилазе из процене предиката у SQL. Колона Булових типова може се ограничити и на само TRUE
и FALSE
.
Један од првих програмских језика који је обезбедио експлицитан булов тип података био је Алгол 60(1960) са вредностима тачно и нетачно и логичким операторима који су означени симболима '' (и), '' (или), '' (имплицира), '' (еквивалентно), and '' (не). Услед ограничења на улазним уређајима и на кодирању знакова на многим рачунарима тог времена, већина компајлера је имала другачије приказе за много оператора, као на пример AND
или 'AND'
.
Овај приступ буловим као уграђеним (или примитивним или на други начин унапред дефинисаним) типом података је усвојен од стране многих програмских језика касније створених, као што су Симула 67 (1967), Алгол 68 (1970),[3] Паскал (1970), Ада (1980), Јава (1995), и С # (2000), између осталих.
Прва верзија ФОРТРАНА (1957) и његов наследник ФОРТРАН II (1958) нису имали логичке вредности или операције; чак и условна изјава IF
је узимала аритметички израз и била смештена у једну од три локације у складу са својим знаком; види аритметик IF. ФОРТРАН IV (1962) је следио пример АЛГОЛА 60 обезбеђивањем Буловог типа података (LOGICAL
), литерала истине (.TRUE.
и .FALSE.
), булових оператора поређења (.EQ.
, .GT.
, итд.), као и логичких оператора (.NOT.
, .AND.
, .OR.
, .XOR.
, .EQV.
). У FORMAT
изјавама, посебни контролни симбол ("L
") је предвиђен за анализу или форматирање логичких вредности.[4]
Lisp језик (1958) никада није имао уграђен у Булов тип података. Уместо тога, условне конструкције попут cond
су логичну вредност "false" представљали као празну листу ()
, која је дефинисана да буде иста као и специјални атом nil
или NIL
; док је било који други Ѕ-израз тумачен као "тачан". Олакшавајуће је то што је, већина модерних дијалеката Lisp-а предефинисала атом t
тако да има вредност t
, па тако могу користити t
као мнемонички запис за "тачно".
Овај приступ ("свака вредност може да се користи као булова вредност") је задржан у већини Lisp дијалектата (Common Lisp, Scheme, Emacs Lisp), и слични модели су усвојени од стране многих скрипт језика, чак и од оних који имају јасан Булов тип или Булову вредност; ипак које вредности се тумаче као "нетачне" и које су "тачне" варира од језика до језика. У Шеми, на пример, "нетачна" вредност је атом различит од празне листе, па се он касније тумачи као "тачан".
Језик Паскал (1970) је увео концепт програмски дефинисаних енумерисаних типова. Уграђени Boolean
тип података је затим обезбеђен као претходно дефинисани енумерисани тип са вредностима FALSE
и TRUE
. По дефиницији, сва поређења, логички оператори, и условне изјаве примењују се и / или дају Boolean
вредности. Иначе, Boolean
тип је имао све објекте који су на располагању енумерисаним типовима у целини - као што су наређивање и индексирање. С друге стране, за конверзацију између Boolean
типа и интиџера (или било којих других типова) и даље је потребно експлицитно тестирање или позив функције, као у Алголу 60. Овај приступ ("Булов тип је енумерисани тип") је усвојен од стране већине каснијих језика који имају енумерисане типове, као што су Модула, Ада и Хаскел.
Прве имплементације на С језику (1972) нису имале Булов тип, и до данашњег дана Булове вредности су обично представљене као цели бројеви (int
) у С програмима. Оператори поређења (>
, ==
, итд) су дефинисани тако да враћају целобројне (int
) вредности, било као 0 (за нетачно) или 1 (за тачно). Логички оператори (&&
, ||
, !
, итд) и изјаве које проверавају услов (if
, while
) усвајају нулу као нетачно, а све остале вредности као тачно.
Након што су енумерисани типови (enum
и) додати у ANSI верзију С (1989), многи С програмери су навикли да на тај начин дефинишу своје Булове типове, због читљивости. Међутим, енумерисани типови су еквивалентни целим бројевима према језичким стандардима; тако да ефективна сличност између Булових типова и целих бројева и даље важи за С програме.
Стандардни С (од С99) даје тип, под називом _Bool
. Укључивањем заглавља stdbool.h
постало је могуће користити интуитивније име bool
и константе true
и false
. Језик гарантује да ће било које две тачне вредности упоредити једнако (што је било немогуће постићи пре увођења овог типа). Булове вредности се и даље понашају као цели бројеви, могу се чувати у целобројним варијаблама, и користити било где где су цели бројеви валидни, укључујући и у индексирању, аритметици, рашчлањивању и форматирању. Овај приступ ("Булове вредности су само цели бројеви") је задржан у свим каснијим С верзијама.
C++ има посебан Булов тип података bool
, али са аутоматском конверзијом из скаларних и показивачких вредности које су веома сличне онима из С. Овај приступ је усвојен од стране многих каснијих језика, нарочито од стране неких скриптованих попут AWK.
Objective-C такође има посебан Булов тип података BOOL
, са могућим вредностима YES
или NO
, еквивалентим са тачно или нетачно.[5] Поред тога, у комплајерима Објективног С могуће је користити С-ов _Bool
тип ( јер Објективни С је подскуп С).
У Перлу, нема Буловог типа података. Уместо тога, било која вредност може да се понаша као Булова у буловом контексту (услов if
или while
изјаве, аргумент &&
или ||
, итд). Број 0
, ниске "0"
и ""
, празна листа ()
, и посебна вредност undef
сматрају се нетачним.[6] Све остало је тачно.
У Пајтону од 2.3 верзије и старије, постоји bool
тип која је подкласа int
-а, стандардног целобројног типа.[7] Има две могуће вредности: True
и False
, које су "специјалне верзије" бројева 1 и 0 и понашају се као и у аритметичком контексту. Поред тога, нумеричка вредност нуле (интиџер или разломак), нулта вредност (None
), празна ниска и празни контејнери (тј листе, скупови, итд) се сматрају нетачним; све остале вредности се сматрају тачним по дифолту.[8] Класе могу дефинисати како ће њихове инстанце бити третиране у Буловом контексту кроз посебан метод __nonzero__
(Пајтон 2) или __bool__
(Пајтон 3). За контејнере, __len__
(посебна метода за одређивање дужине контејнера) се користи ако експлицитни Булов метод конверзије није дефинисан.
У Руби, с друге стране, само nil
(Рубијева нулта вредност) и посебан false
објекат су "нетачни", све остало (укључујући и цео број 0 и празне низове) је "тачно".
У ЈаваСкрипту, празна ниска (""
), null
, undefined
, NaN
, +0, −0 и false
[9] се понекад називају "falsy", и њихови комплементи "truthy", да истакне разлику између строго проверених типова и присиљених булових типова.[10] Језици као што је PHP такође користе овај приступ.
SQL: 1999 је увео Булов тип података као опциони облик (Т031). Када је ограничен NOT NULL
ограничењем, SQL BOOLEAN се понашао као и буловни тип у другим језицима. У SQL-у булов тип је nullable тип по дифолту као и све остале врсте SQL података, што значи да исто тако може имати посебну нулту вредност. Иако стандардни SQL дефинише три литерала за булов тип: TRUE, FALSE и UNKNOWN, такође се каже да се NULL BOOLEAN и UNKNOWN "могу користити наизменично да означе потпуно исту ствар".[11][12] То је довело до неких контроверзи, јер идентификациони субјекти UNKNOWN су еквивалентни правилима поређења за NULL. Тачније UNKNOWN = UNKNOWN није TRUE него UNKNOWN/NULL.[13] Године 2012. неколико великих SQL система имплементирало је функцију Т031.[14] PostgreSQL је изузетак, иако не спроводи у UNKNOWN литерал..; NULL може да се користи.[15]
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.