Булов податочен тип

**Булов податочен тип** — податочен тип во информатиката кој што има една од две можни вредности (кои обично се означуваат како точна и *неточна*) чија намена е да ги претстави двете вистинитосни вредности на логиката и на Буловата алгебра . Наречено е по Џорџ Бул, кој прв го дефинирал алгебарскиот систем на логиката во средината на 19 век. Буловиот податочен тип е првенствено поврзан со условни искази, кои овозможуваат различни дејства со промена на контролниот проток, во зависност од тоа дали Буловата *состојба* специфицирана од програмерот се проценува како точна или неточна. Тоа е посебен случај на поопшт *логички тип на податоци (погледнете [[веројатносна логика]] )-* логиката не треба секогаш да е Булова.

## Генерално
Во програмските јазици со вграден Булов тип на податоци, како Паскал и Јава, операторите за споредба како  `>` и `≠` обично се дефинирани да враќаат Булова вредност. Може да се дефинираат условни и итеративни команди за да се тестираат изрази со Булова вредност.

Јазиците без експлицитен Булов тип на податоци, како C90 и Lisp, сè уште може да прикажуваат вистинитосни вредности со некој друг податочен тип. Заеднички Lisp користи празен список за неточно, и било која друга вредност за точно. Програмскиот јазик C користи цел број, каде што релационите изрази како `i > j` и логичките изрази поврзани со `&&` и `||` се дефинирани да имаат вредност 1 ако е точно и 0 ако е неточно, додека тест-деловите од `if`, `while`, `for`, итн., ја третираат секоја не-нулта вредност како вистинита. Навистина, Булова променлива може да се смета (и имплементира) како бројчена променлива со една бинарна цифра (бит), која што може да зачува само две вредности. Имплементацијата на Булови податоци во компјутерите е најверојатно претставена како целосен збор, наместо како бит; ова обично се должи на начините на кои што компјутерите пренесуваат блокови од информации.

Повеќето програмски јазици, дури и оние кои немаат експлицитен Булов тип, нудат поддршка за Булови алгебарски операции како што се конјункција ( `AND`, `&`, `*` ), дисјункција ( `OR`, `|`, `+` ), еквиваленција ( `EQV`, `=`, `==` ), исклучителна дисјункција( `XOR`, `NEQV`, `^` `!=` ) и негација ( `NOT`, `~` `!` ).

Во некои јазици, како што се Ruby, Smalltalk и Alice, *вредностите за точно и неточно* припаѓаат на одделни класи, т.е. `True` и `False`, соодветно, така што немаме само еден Булов тип.

Во SQL, кој што користи логика за три вредности при експлицитни споредби, поради неговиот посебен третман на Nulls, Буловиот податочен тип (воведен во SQL: 1999) исто така е дефиниран да вклучува повеќе од две вистинитосни вредности, така што *Буловите вредности во* SQL ќе може да ги зачуваат сите логички вредности што произлегуваат од евалуацијата на предикатите во SQL. Колона од Булов тип, исто така, може да биде ограничена на само `TRUE` и `FALSE`.

## АLGOL и вграден Булов тип
Еден од најраните програмски јазици што овозможува експлицитен *Булов податочен тип* е ALGOL 60 (1960) со вредности *за точно и неточно* и логички оператори претставени со симболи '\wedge\vee\supset\equiv' (еквиваленција), и '\neg' (негација). Како резултат на ограничувањата за внесување во уредот и сетот на карактери, на многу компјутери во тоа време, сепак, повеќето од компајлерите користеа алтернативни претстави за многу од операторите, како што се `AND` или `'AND'`.

Овој пристап со Булова вредност како вграден (или примитивен или на друг начин предефиниран) податочен тип беше усвоен од многу подоцнежни програмски јазици, како што се Simula 67 (1967), ALGOL 68 (1970), Паскал (1970), Ada (1980), Јава (1995) и C # (2000), меѓу другите.

## Fortran
Првата верзија на FORTRAN (1957) и нејзиниот наследник FORTRAN II (1958) немаат логички вредности или операции; дури и условната изјава `IF` носи аритметички израз и се разгранува на една од трите локации според нејзиниот знак. FORTRAN IV (1962), сепак, го следи примерот на АЛГОЛ 60 со давање Булов тип на податоци ( `LOGICAL` ), вистинити букви ( `.` `TRUE.` и `.` `FALSE.` ), Оператори за бројчена споредба со булова вредност ( `.` `EQ.`, `.` `GT.` и сл.), и логички оператори ( `.` `NOT.`, `.` `AND.`, `.` `OR.` ) Во исказите на `FORMAT`, одреден опис на формат (' `L` ') е даден за анализирање или форматирање на логички вредности.

## Lisp и Scheme
Јазикот Lisp (1958) никогаш немал вграден Булов тип на податоци. Наместо тоа, условните конструкции како `cond` претпоставуваат дека логичката вредност *false* е претставена со празната листа `()`, што е дефинирано дека е иста со специјалниот атом `nil` или `NIL` ; со оглед на тоа што секој друг израз се толкува како *вистински* . За погодност, повеќето современи дијалекти на Lisp го дефинираат атомот `t` да има вредност `t`, така што `t` може да се користи како мнемониска нотација за *точно* .

Овој пристап (*која било вредност може да се користи како Булова вредност* ) беше задржан во повеќето дијалекти на  Lisp( Common Lisp, Scheme, Emacs Lisp) и слични модели беа усвоени од многу скриптни јазици, дури и оние со различен Булов тип или Булови вредности; иако кои вредности се толкуваат како *лажни* и кои се *точни* варираат од јазик до јазик. На пример, во Scheme, *лажната* вредност е атом различен од празната листа, така што последната се толкува како *вистинска* .

## Паскал, Ада и Хаскел
Јазикот Паскал (1970) го воведе концептот на набројани типови дефинирани од програмер. Вграден `Boolean` тип на податоци тогаш беше даден како однапред дефиниран наброен тип со вредности `FALSE` и `TRUE` . По дефиниција, сите споредби, логички операции и условени искази применети на и / или дадоа `Boolean` вредности. Инаку, `Boolean` тип ги имаше сите капацитети што беа достапни за набројаните типови воопшто, како што се нарачување и употреба како индекси. Спротивно на тоа, претворањето помеѓу `Boolean` и цели броеви (или кој било друг вид) сепак бара експлицитни тестови или функциски повици, како во АЛГОЛ 60. Овој пристап (*Буловиот е наброен тип*) беше усвоен од повеќето подоцнежни јазици кои имаа набројани типови, како што се Модула, Ада и Хаскел .

## C, C ++, Objective-C, AWK
Почетна имплементација на јазик C (1972) не обезбеди рационален тип, и на овој ден Булова вредност најчесто се претставени со цели броеви ( `int` а) во C програми. Операторите за споредба ( `&#x3E;`, `==`, итн.) Се дефинирани за да се врати потпишан цел број ( `int` ) резултат, или 0 (за неточно) или 1 (за точно). Логичките оператори ( `&#x26; &#x26;`, `||`, `!`, Итн.) И изјавите за тестирање на состојбата ( `if`, `while` ) претпоставуваат дека нулата е лажна и сите други вредности се точни.

Откако набројаните типови ( `enum` ) беа додадени на верзијата на Американскиот национален институт за стандарди на C, ANSI C (1989), многу C програмери се навикнаа да ги дефинираат сопствените типови булови како такви, од причини за читливост. Сепак, набројаните типови се еквивалентни на цели броеви според јазичните стандарди; така, делотворниот идентитет помеѓу Буловите вредности и интегралите е сè уште валиден за програмите C.

Стандардот C (од C99 ) обезбедува `_Bool` тип, наречен `_Bool` . Вклучувајќи го заглавието `stdbool.h`, може да се користи поинтуитивното име `bool` и константите `true` и `false` . Јазикот гарантира дека двете вистински вредности ќе се споредат еднакви (што беше невозможно да се постигне пред воведувањето на типот). Буловите вредности сè уште се однесуваат како цели броеви, можат да бидат зачувани во целобројни променливи и да се користат каде што ќе бидат валидни цели броеви, вклучително и во индексирање, аритметика, расчленуваање и форматирање. Овој пристап ( *Буловите вредности се само цели броеви* ) е задржан во сите подоцнежни верзии на В. Забележете дека ова не значи дека која било цел број вредност може да се зачува во булова променлива.

C ++ има посебен Boole тип на податоци `bool`, но со автоматски конверзии од скаларни и покажувачки вредности кои се многу слични на оние на C. Овој пристап беше усвоен и од многу подоцнежни јазици, особено од некои скриптни јазици како што е AWK .

Цел-Ц, исто така, има посебен Булов тип на податоци `BOOL`, со можни вредности `YES` или `NO`, еквиваленти на вистинити и лажни, соодветно. Исто така, кај компајлерите на Цел-Ц што поддржуваат C99, може да се користи типот `_Bool` Ц, бидејќи Цел-Ц е суперсет на С.

## Перл и Луа
Перл нема типов булови податоци. Наместо тоа, која било вредност може да се однесува како булова во булозен контекст (состојба на изјава `if` or `while`, аргумент на `&&` или `||` итн ) Бројот `0`, низите `"0"` и `""`, празната листа `()` и специјалната вредност `undef` проценуваат на неточни. Сè друго оценува како точно.

Lua има Булов тип на податоци, но не-буловните вредности исто така можат да се однесуваат како булова. `nil` проценува на лажна, додека секој друг тип на податоци секогаш се проценува на вистинит, без оглед на вредноста.

## Tcl
Tcl нема посебен Булов тип. Како и во Ц, се користат интегралите 0 (погрешно) и 1 (точно - всушност било кој не е нула цел број).

Примери за кодирање:

`
set v 1
if { $v } { puts "V is 1 or true" }
`

Горенаведеното ќе покаже „V е 1 или точно“, бидејќи изразот оценува на „1“

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

Горенаведеното ќе донесе грешка бидејќи променливата „v“ не може да се оцени како „0“ или „1“

## Python, Ruby и JavaScript
Python, од верзијата 2.3 и понатаму, има `bool` тип што е подкласа на `int`, стандарден тип на цел број. Има две можни вредности: `True` и `False`, кои се *специјални верзии* на 1 и 0 соодветно и се однесуваат како такво во аритметички контексти. Исто така, бројчената вредност на нула (цел број или дропки), нултата вредност ( `None` ), празната низа и празните контејнери (т.е. списоци, множества и сл.) Се сметаат за логички лажни; сите други вредности стандардно се сметаат за Булови точни. Класите можат да дефинираат како се третираат нивните инстанци во `__nonzero__` контекст преку специјалниот метод `__nonzero__` (Python 2) или `__bool__` (Python 3). За контејнери, се користи `__len__` (специјалниот метод за одредување на должината на контејнерите) ако не е дефиниран експлицитниот метод на Булово претворање.

За разлика од Ruby, само `nil` (нула вредност на Руби) и посебен `false` објект се *лажни*, сè друго (вклучувајќи го и цел број 0 и празни низи) е *точно* .

Во JavaScript, празната низа ( `""` ), `null`, `undefined`, `NaN`, +0, −0 и `false` понекогаш се нарекуваат *лажни* (од кои комплементот е *правилен* ) за да се прави разлика помеѓу строго проверени *буловци* и принудени . Наспроти Пајтон, празни контејнери (низи, мапи, комплети) се сметаат за паметни. Јазиците како што е PHP исто така го користат овој пристап.

## Следната генерација на Shell
Next Generation Shell, има тип `Bool` . Има две можни вредности: `true` и `false` . `Bool` не може да се замени со `Int` и треба да се претвори експлицитно доколку е потребно. Кога е потребна Булова вредност на израз (на пример, `if` изјава), се повикува метод `Bool` . Методот `Bool` за вградени типови е дефиниран така што враќа `false` за бројчена вредност нула, `null` вредност, празна низа, празни контејнери (т.е. списоци, множества и сл.), Надворешни процеси што излегле со не-нула излез код ; за другите вредности `Bool` враќа точно. Видовите за кои е дефиниран методот `Bool` може да се користат во Булов контекст. Кога оценувате израз во Булов контекст, Ако не е дефиниран соодветен метод `Bool`, се фрла исклучок.

## SQL
Буловите вредности се појавуваат во SQL кога е потребен услов, како што е клаузулата WHERE, во форма на предикат што се произведува со употреба на оператори како што се оператори за споредба, IN оператор, НЕ Е (НЕ) НУЛА итн. Сепак, освен ВИСТИНСКИ и ЛА FНИ, овие оператори можат да дадат и трета состојба, наречена НЕПОЗНАТ, кога ќе се направи споредба со NULL.

Третманот на буловите вредности се разликува помеѓу SQL системите.

На пример, во Microsoft SQL Server, буловата вредност воопшто не е поддржана, ниту како самостоен тип на податок, ниту претставена како цел број. Тоа покажува порака за грешка „Израз од не-булов тип наведен во контекст каде што се очекува состојба“ ако колона е директно употребена во клаузулата КАДЕ, на пр. `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), ВИСТИНСКО е исто како цел број 1, а ЛА FНО е исто цел број 0. и го третира секој не-нула цел број како вистински кога ги проценува условите .

Стандардот SQL92 воведе IS (НЕ) ТОЧНО, НЕ Е (НЕ) НЕТОЧНО, Е (НЕ) НЕПОЗНАТ оператори што проценуваат предикат, што претходело на воведување Булов тип во SQL: 1999

Стандардот SQL: 1999 воведе BOOLEAN тип на податок како опционална одлика (T031). Кога е ограничено со `NOT NULL` ограничување, SQL BOOLEAN се однесува како Булованец на други јазици, што може да зачува само ВИСТИНСКИ и ЛАSEНИ вредности. Меѓутоа, ако е nullable, што е стандардно како и сите други SQL типови на податоци, може да има и посебна нулта вредност. Иако стандардот SQL дефинира три буква за типот BOOLEAN - ВИСТИНСКИ, ЛАSEНИ и НЕПОЗНАТ - тој исто така вели дека NULL BOOLEAN и НЕПОЗНАТ „може да се користат наизменично за да значат точно иста работа“. Ова предизвика одредени полемики затоа што идентификациските теми се НЕПОЗНАТИ според правилата за споредба на еднаквоста за НУКЛО. Поточно НЕПОЗНАВАЕ = НЕПОЗНАТ не е ВИСТИНСКО, но НЕПОЗНАТ / НЕСТА. Од 2012 година, неколку големи SQL системи ја имплементираат одликата T031. Firebird и PostgreSQL се значајни исклучоци, иако PostgreSQL не спроведува НЕПОЗНАТ буквално; Наместо тоа, може да се користи NULL.

„Мајкрософт пристап“, кој го користи моторот на базата на податоци „Мајкрософт џет“, исто така нема типов на бул податоци Слично на MS SQL Server, тој користи тип на податоци BIT. Во Access е познат како Да / Не тип на податок кој може да има две вредности; Да (точно) или не (неточно). Типот на податоци BIT во Access може исто така да биде претставен и бројчено; Точно е -1 и лажно е 0. Ова се разликува од MS SQL Server на два начина, иако и двата се производи на Microsoft:

# Пристапот претставува вистинито како -1, додека тој е 1 во SQL Server
# Пристапот не поддржува Null три-состојба, поддржана од SQL Server

## Tableau
Софтверот Tableau има тип на податок BOOLEAN. Буквалната булова вредност е `True` или `False`.

Буловото Tableau се претвора во број користејќи ја функцијата `INT()`. Завиткување на булово поле во `INT()` враќа 1 (за True) или 0 (за False).

## Поврзано
* Булова алгебра
* Податочен тип

## Наводи

Категорија:Видови податоци
Категорија:Булова алгебра