布尔类型

**布林**（英語：**Boolean**）是電腦科學中的邏輯資料類型，以發明布林代數的數學家喬治・布爾為名。它是只有兩種值的原始類型，通常是真和假。布爾數據類型主要與條件語句相關聯，條件語句通過根據開發人員指定的條件式，更改程式控制流來允許評估語句的運算值為真或假（即條件成立或不成立)）。這是一種更廣泛的邏輯數據類型的特殊情況（參見概率邏輯）－邏輯並不總是只屬於布爾類型的。

在一些語言中，布林資料類型被定義為可代表多於兩個真值。例如，ISO SQL:1999 標準定義了一個 SQL 布林型可以儲存三個可能的值：真、假、未知（SQL null 被當作未知真值來處理，但僅僅在布林型中使用）。在此情況下，未知先於真及假，因為布爾型一開始是未有實際值，其值是 unknown（也有機會是隨機值）而非真。

## Ada

Ada 在標準包中定義 `Boolean` 為一種列舉型別，有兩種值 `False` 和 `True`，並且 `False` < `True`。

相關的操作（`=`, `/=`, `<`, `<=`, `>`, `>=`）使用語所有的列舉型別，包括 `Boolean`。布林運算 `and`, `or`, `xor` 和 `not` 由 `Boolean` 及任意聲明的子類型定義。布林運算也適用於 `Boolean` 值陣列。

## Algol

Algol 60 有 `Boolean` 資料類型和相關的操作，定義在 Algol 60 報告中。這在 ALGOL 68 中被簡化為 `bool`。

**ALGOL 68** 語言詳細說明（177 頁）中關於布林操作定義的原文：

10.2.2. 布林運算元的運算

1. **op** ? = (**bool** a, b) **bool**:( a | **true** | b );
2. **op** ? = (**bool** a, b) **bool**: ( a | b | **false** );
3. **op** ? = (**bool** a) **bool**: ( a | **false** | **true** );
4. **op** = = (**bool** a, b) **bool**:( a?b ) ? ( ?b??a );
5. **op** ≠ = (**bool** a, b) **bool**: ?(a=b);
6. **op** **abs** = (**bool** a)**int**: ( a | 1 | 0 );

## C

在 C99 之前，C 語言的標準沒有提供布林型別，但是這不意味著 C90 不能表示布林值的概念。C 中的所有布林運算（&&, ||）以及條件聲明（if, while）都以非零值代表**真**，零值代表**假**。這樣，在其他型別如一個整數或一個列舉中儲存布林值就變得很平常。為了方便，常常為布林型別建立一個 typedef 來和一些已存在的資料類型相關聯。C99 標準也提供了一個內建的布林型別。

為了說明 C 中的布林型，注意以下 C 代碼：

等價於：

簡單來說這就是一個整數型別。由於 C 標準要求 `0` 用在指標上下文中時要代表空指標，上面的概念也可以用來檢查一個指標是否為空，雖然一些程式風格不建議這樣用。這種情況同樣適用於浮點值，當比較它們的時候要特別小心，因為它們通常包含四捨五入的結果。通常，整型用來包含布林變數。

雖然為了測試一個變數的真假值時沒必要來命名真或假，但是在給它們分配值的時候卻是需要的。（一種方法是使用零值和一，這樣做的好處是語言獨立。）其他方法，`enum` 關鍵字允許在語言中根據你的選擇來命名元素，例如：

如下典型的預處理巨集經常被使用。

有時 `TRUE` 可能被定義為 - 1 或～0（位元運算 0 的補）。這意味著在現在常見的二補數電腦架構的整型中所有的位都被設定為 1。

但是，在 C 中**任意**非零值都代表真就帶來了問題，因為 `TRUE` 由一個**特定**的值來表示，因此在其他語言中 `if (foo == TRUE) ...` 只不過是多餘的，而在 C 中，就是**錯誤的**代碼。

### C99

C99 中有 `bool` 型別，取值為 `true` 和 `false`，定義在 `<stdbool.h>` 標頭檔中：

## C++

C++ 程式語言在其標準化過程中引入了 `bool`、`true` 和 `false` 關鍵字，增加了原生資料類型來支援布林資料，其大小被實現定義。 `bool` 在 1993 年被引入。.

1998 年的 C++ 標準函式庫定義了一個 `vector<bool>` 類別的特例。為了最佳化空間，其中的元素被打包，使得每一個布林變數只使用一位記憶體。這被認為是一個錯誤。`vector<bool>` 不符合 STL 容器的需要。例如一個 `container<T>::reference` 必須為 `T` 型別的一個真值左值。這和 `vector<bool>` 的情況不同。類似地，`vector<bool>::iterator` 在解除參照時不產生一個 `bool&`。在 C++ 標準委員會和函式庫工作群組之間有個共識，就是 `vector<bool>` 應該被反對或完全從下一個標準中被移除。

## C#

在 C# 中，布林變數通過保留字 `bool` 來辨識，這個保留字是預定義結構型別 `System.Boolean` 的別名，占一位元組。在 `bool` 和其他型別之間不存在標準的轉換。此語言還提供了一個布林型別 `DBbool`，可以表示三種值：`true`、`false` 和 `null`。這和 SQL 中布林表達式的用法類似。

輸出一個布林型的代碼如下：

## Fortran

在 Fortran 被標準化之前，於 1950 年代引入了 `LOGICAL` 關鍵字和相關的操作 `.NOT.`、`.AND.`、`.OR.` 等等。

## Java

在 Java 語言中，布林變數由原始型別 `boolean` 表示。Java 虛擬機器將實際在記憶體中的表現抽象，這樣 JVM 開發者可以使用儘可能方便的方式來代表布林量（例如，一個位元組或者一個字）。

Java 語言規範不允許任何顯式或隱式的從 `boolean` 的轉換。這樣就需要編譯器拒絕如下代碼：

因為整型變數 `i` 不能轉換為一個布林型並且 `if` 語句需要一個 `boolean` 條件。

在 Java 中，`boolean` 值（和其他原始型別相同）可以被附加到字串。這個特性提供了一個預設的布林型的視覺化表現（`true` 被顯示為 "true"，`false` 被顯示為 "false"）。

## JavaScript

JavaScript 有兩個關鍵字，`true` 和 `false`，兩者都為小寫。JavaScript 是一種弱型別的語言，沒有明確的布林資料類型供其變數使用。但是許多值用在邏輯上下文時可以被當成 `false`，包括零（`0`）、`null`、零長度字串（`""`）、`NaN` 以及 `undefined`。所有其他變數值，包括一（`1`）、空陣列和空物件，都被認為是 `true`。JavaScript 提供了一個 `Boolean` 物件，可以被用作控制布林值的容包裝。

但如果使用 `Boolean` 物件的話，它總是會被當成 `true`，儘管其包含 `false` 值。

若僅使用 `Boolean()` function，則視同將參數轉為布林值

由於 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 語言的布林語意也適用。

## Swift

Swift 的布林型別是 `Bool`，主要用於 if 和 while 的條件判斷，值只能是真 `true` 或假 `false`。

## Ocaml

Ocaml 擁有一個 `bool` 值，為 `true` 或 `false`。

和很多其它的語言一樣，Ocaml 使用 `true` 或 `false` 關鍵字來表示布林值。

## Pascal

`Boolean` 是 Pascal 提供的基本資料類型，定義和用法如下：

列舉外的值沒有被定義。某些編譯器實現（如 Delphi）為了介面目的擁有特殊的擴充布林型別，並將其對映到 C 數值型別上，例如 bytebool、wordbool、longbool 等。

## 參考文獻