布林(英語:Boolean)是電腦科學中的邏輯資料類型,以發明布林代數的數學家喬治·布爾為名。它是只有兩種值的原始類型,通常是真和假。布爾數據類型主要與條件語句相關聯,條件語句通過根據開發人員指定的條件式,更改程式控制流來允許評估語句的運算值為真或假(即條件成立或不成立))。這是一種更廣泛的邏輯數據類型的特殊情況(參見概率邏輯)-邏輯並不總是只屬於布爾類型的。
「布林」的各地常用名稱中國大陸布爾 港澳布林 臺灣布林
「布爾值」重新導向至此。關於其他用法,請見「布林」。
在一些語言中,布林資料類型被定義為可代表多於兩個真值。例如,ISO SQL:1999標準定義了一個SQL布林型可以儲存三個可能的值:真、假、未知(SQL null被當作未知真值來處理,但僅僅在布林型中使用)。在此情況下,未知先於真及假,因為布爾型一開始是未有實際值,其值是unknown(也有機會是隨機值)而非真。
目次
1 Ada
2 Algol
3 C
3.1 C99
4 C++
5 C#
6 Fortran
7 Java
8 JavaScript
9 λ演算
10 Lisp
11 ML
12 Objective-C
13 Ocaml
14 Pascal
15 Python
16 Swift
17 參考文獻
Ada
編輯
Ada在標準包中定義Boolean為一種列舉型別,有兩種值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報告中。這在ALGOL 68中被簡化為bool。[1]
ALGOL 68語言詳細說明(177頁)中關於布林操作定義的原文:
10.2.2. 布林運算元的運算
op ? = (bool a, b) bool:( a | true | b );
op ? = (bool a, b) bool: ( a | b | false );
op ? = (bool a) bool: ( a | false | true );
op = = (bool a, b) bool:( a?b ) ? ( ?b??a );
op ≠ = (bool a, b) bool: ?(a=b);
op abs = (bool a)int: ( a | 1 | 0 );
C
編輯
在C99之前,C語言的標準沒有提供布林型別,但是這不意味著C90不能表示布林值的概念。C中的所有布林運算(&&, ||)以及條件聲明(if, while)都以非零值代表真,零值代表假。這樣,在其他型別如一個整數或一個列舉中儲存布林值就變得很平常。為了方便,常常為布林型別建立一個typedef來和一些已存在的資料類型相關聯。C99標準也提供了一個內建的布林型別。
為了說明C中的布林型,注意以下C代碼:
if (my_variable) {
printf("True!\n");
} else {
printf("False!\n");
}
等價於:
if (my_variable != 0) {
printf("True!\n");
} else {
printf("False!\n");
}
簡單來說這就是一個整數型別。由於C標準要求0用在指標上下文中時要代表空指標,上面的概念也可以用來檢查一個指標是否為空,雖然一些程式風格不建議這樣用。這種情況同樣適用於浮點值,當比較它們的時候要特別小心,因為它們通常包含四捨五入的結果。通常,整型用來包含布林變數。
雖然為了測試一個變數的真假值時沒必要來命名真或假,但是在給它們分配值的時候卻是需要的。(一種方法是使用零值和一,這樣做的好處是語言獨立。)其他方法,enum關鍵字允許在語言中根據你的選擇來命名元素,例如:
typedef enum { FALSE, TRUE } boolean;
...
boolean b;
如下典型的預處理巨集經常被使用。
#define FALSE 0
#define TRUE 1
...
int f = FALSE;
有時TRUE可能被定義為-1或~0(位元運算0的補)。這意味著在現在常見的二補數電腦架構的整型中所有的位都被設定為1。
但是,在C中任意非零值都代表真就帶來了問題,因為TRUE由一個特定的值來表示,因此在其他語言中if (foo == TRUE) ...只不過是多餘的,而在C中,就是錯誤的代碼。
C99
編輯
C99中有bool型別,取值為true和false,定義在
#include
bool b = false;
...
b = true;
C++
編輯
C++程式語言在其標準化過程中引入了bool、true和false關鍵字,增加了原生資料類型來支援布林資料,其大小被實現定義。[2]bool在1993年被引入。[3].
1998年的C++標準函式庫定義了一個vector
C#
編輯
在C#中,布林變數通過保留字bool來辨識,這個保留字是預定義結構型別System.Boolean的別名,占一位元組。在bool和其他型別之間不存在標準的轉換。此語言還提供了一個布林型別DBbool,可以表示三種值:true、false和null。這和SQL中布林表達式的用法類似。[6]
輸出一個布林型的代碼如下:
bool myBool = (i == 5);
System.Console.WriteLine(myBool ? "I = 5" : "I != 5");
Fortran
編輯
在Fortran被標準化之前,於1950年代引入了LOGICAL關鍵字和相關的操作.NOT.、.AND.、.OR.等等。
logical :: bool ! 宣告一個布林變數名稱為bool
bool=.true. ! 將變數bool存入值.true.
if (bool) then ! 由於條件為.true.所以進入內部執行
print*,"bool=",bool ! 顯示 bool=T
bool=1==2 ! 1==2的運算結果是.false.,將.false.存入變數bool
print*,"bool=",bool ! 再次顯示,這時候變成 bool=F
end if
Java
編輯
在Java語言中,布林變數由原始型別boolean表示。Java虛擬機器將實際在主記憶體中的表現抽象,這樣JVM開發者可以使用儘可能方便的方式來代表布林量(例如,一個位元組或者一個字)。
Java語言規範不允許任何顯式或隱式的從boolean的轉換。這樣就需要編譯器拒絕如下代碼:
int i = 1;
if (i)
System.out.println("i is not zero.");
else
System.out.println("i is zero.");
因為整型變數i不能轉換為一個布林型並且if語句需要一個boolean條件。[7]
在Java中,boolean值(和其他原始型別相同)可以被附加到字串。這個特性提供了一個預設的布林型的視覺化表現(true被顯示為"true",false被顯示為"false")。[7]
JavaScript
編輯
JavaScript有兩個關鍵字,true和false,兩者都為小寫。JavaScript是一種弱型別的語言,沒有明確的布林資料類型供其變數使用。但是許多值用在邏輯上下文時可以被當成false,包括零(0)、null、零長度字串("")、NaN以及undefined。所有其他變數值,包括一(1)、空陣列和空對象,都被認為是true。JavaScript 提供了一個Boolean 對象,可以被用作控制布林值的容包裝。
var boolean = true; //設boolean為true
if(boolean && 1){
console.log("This is true."); //將會顯示這個,因為boolean是true和1亦是true
}else{
console.log("This is false.");
}
但如果使用Boolean物件的話,它總是會被當成true,儘管其包含false值。
var boolean = new Boolean(false); //設boolean為一個Boolean物件,並設定其內容為false
if(boolean){
console.log("This is true."); //將會顯示這個,因為Boolean物件不是null
}else{
console.log("This is false.");
}
若僅使用 Boolean() function,則視同將參數轉為布林值
var boolean = Boolean(false); //等同於將 boolean 設為 false
if(boolean){
console.log("This is true.");
}else{
console.log("This is false."); //將會顯示這個,因為 boolean 的值為 false
}
由於JavaScript的歷史相容性和隱性型別轉換,空陣列([])、字元「0」的字串("0")、水平制表字元的字串("\t")互為不寬鬆等同(!=),但都寬鬆等同(==)於數字0(0),被形容為「JavaScript的三位一體」的迷因。
λ演算
編輯
在λ演算計算模型中,布林型由Church數表示。
Lisp
編輯
LISP有兩個特殊的符號T和NIL,分別代表了邏輯值真和假。但是,任意非NIL值都由LISP系統翻譯成真。特殊的符號NIL也用空串列()表示。因此空串列為假,但是任何有資料的列表都為真。這樣,什麼都沒有為假,其他所有都為真。
ML
編輯
和Ocaml類似,ML語言擁有bool型別,包含true和false值,例如:
- fun isittrue x = if x then "YES" else "NO" ;
> val isittrue = fn : bool -> string
- isittrue true;
> val it = "YES" : string
- isittrue false;
> val it = "NO" : string
- isittrue (8=8);
> val it = "YES" : string
- isittrue (7=5);
> val it = "NO" : string
Objective-C
編輯
Objective-C提供了BOOL型別,以及巨集YES和NO。由於Objective-C是C語言的超集,因此C語言的布林語意也適用。
Ocaml
編輯
Ocaml 擁有一個 bool 值,為 true 或 false。
# 1 = 1 ;;
- : bool = true
和很多其它的語言一樣,Ocaml使用 true 或 false關鍵字來表示布林值。
Pascal
編輯
Boolean是Pascal提供的基本資料類型,定義和用法如下:
(* 系统或标准声明 *)
Type
Boolean = (False,True);
(* 用法 *)
var
value: Boolean;
...
value := True;
value := False;
if value then
begin
...
end;
Python
編輯
Swift
編輯
Swift的布林型別是 Bool,主要用於 if 和 while 的條件判斷,值只能是真true或假false。
let isSuccess = true
let isOpenDoor = false
列舉外的值沒有被定義。某些編譯器實現(如Delphi)為了介面目的擁有特殊的擴充布林型別,並將其對映到C數值型別上,例如bytebool、wordbool、longbool等。
參考文獻
編輯
^ Report on the Algorithmic Language ALGOL 68, Section 10.2.2. (PDF). Aug 1968 [2007 Apr]. (原始內容存檔 (PDF)於2012-07-17). 請檢查|access-date=中的日期值 (幫助)
^ Working Paper for Draft Proposed International Standard for Information Systems-- Programming Language C++. Dec 1996 [2007 May]. (原始內容存檔於2016-03-04). 請檢查|access-date=中的日期值 (幫助)
^ Evolving a language in and for the real world: C++ 1991-2006 (PDF). 2007 [2008 March]. (原始內容存檔 (PDF)於2007-11-20). 請檢查|access-date=中的日期值 (幫助)
^ vector
^ A Specification to deprecate vector
^ C# Language Specifications: Database boolean type. Microsoft Development Network. [2014-02-24]. (原始內容存檔於2016-05-09) (英語).
^ 7.0 7.1 Java Language and Virtual Machine Specifications. ORACLE. [2014-02-24]. (原始內容存檔於2009-02-26) (英語).