布林 (资料类型)

布林（Boolean）是计算机科学中的逻辑数据类型，以发明布林代数的数学家乔治·布尔为名。它是只有两种值的原始类型，通常是真和假。布尔数据类型主要与条件语句相关联，条件语句通过根据开发人员指定的条件式，更改程序控制流来允许评估语句的运算值为真或假（即条件成立或不成立)）。这是一种更广泛的逻辑数据类型的特殊情况（参见概率逻辑）－逻辑并不总是只属于布尔类型的。

在一些语言中，布尔数据类型被定义为可代表多于两个真值。例如，ISO SQL:1999标准定义了一个SQL布尔型可以储存三个可能的值：真、假、未知（SQL null被当作未知真值来处理，但仅仅在布尔型中使用）。在此情况下，未知先于真及假，因为布尔型一开始是未有实际值，其值是unknown（也有机会是随机值）而非真。

## Ada

Ada在标准包中定义`Boolean`为一种枚举类型，有两种值`False`和`True`，并且`False` < `True`。

```ada
type Boolean is (False, True);
 
p : Boolean := True;
...
if p then
  ...
end if;
```

相关的操作（`=`, `/=`, `&lt;`, `&lt;=`, `&gt;`, `&gt;=`）使用语所有的枚举类型，包括`Boolean`。布尔运算`and`, `or`, `xor`和`not`由`Boolean`及任意声明的子类型定义。布尔运算也适用于`Boolean`值数组。

## Algol

Algol 60有`Boolean`数据类型和相关的操作，定义在Algol 60报告中。这在ALGOL 68中被简化为`<u>bool</u>`。

ALGOL 68语言详细说明（177页）中关于布尔操作定义的原文：

10.2.2. 布尔操作数的运算

- op = = (bool a, b) bool:( a?b ) ? ( ?b??a );
- op ≠ = (bool a, b) bool: ?(a=b);

## C

在C99之前，C语言的标准没有提供布尔类型，但是这不意味着C90不能表示布尔值的概念。C中的所有布尔运算（&&,

）以及条件声明（if, while）都以非零值代表真，零值代表假。这样，在其他类型如一个整数或一个枚举中保存布尔值就变得很平常。为了方便，常常为布尔类型创建一个typedef来和一些已存在的数据类型相关联。C99标准也提供了一个内置的布尔类型。

为了说明C中的布尔型，注意以下C代码：

```c
if (my_variable) {
  printf("True!\n");
} else {
  printf("False!\n");
}
```

等价于：

```c
if (my_variable != 0) {
  printf("True!\n");
} else {
  printf("False!\n");
}
```

简单来说这就是一个整数类型。由于C标准要求`0`用在指针上下文中时要代表空指针，上面的概念也可以用来检查一个指针是否为空，虽然一些程序风格不建议这样用。这种情况同样适用于浮点值，当比较它们的时候要特别小心，因为它们通常包含四舍五入的结果。通常，整型用来包含布尔变量。

虽然为了测试一个变量的真假值时没必要来命名真或假，但是在给它们分配值的时候却是需要的。（一种方法是使用零值和一，这样做的好处是语言独立。）其他方法，`enum`关键字允许在语言中根据你的选择来命名元素，例如：

```c
typedef enum { FALSE, TRUE } boolean;
...
boolean b;
```

如下典型的预处理宏经常被使用。

```c
#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`，定义在`&lt;stdbool.h&gt;`头文件中：

```c
#include <stdbool.h>
bool b = false;
...
b = true;
```

## 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中布尔表达式的用法类似。

输出一个布尔型的代码如下：

```csharp
bool myBool = (i == 5);
System.Console.WriteLine(myBool ? "I = 5" : "I != 5");
```

## Fortran

在Fortran被标准化之前，于1950年代引入了`LOGICAL`关键字和相关的操作`.NOT.`、`.AND.`、`.OR.`等等。

```fortran
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`的转换。这样就需要编译器拒绝如下代码：

```java
int i = 1;
if (i)
  System.out.println("i is not zero.");
else
  System.out.println("i is zero.");
```

因为整型变量`i`不能转换为一个布尔型并且`if`语句需要一个`boolean`条件。

在Java中，`boolean`值（和其他原始类型相同）可以被附加到字符串。这个特性提供了一个默认的布尔型的可视化表现（`true`被显示为"true"，`false`被显示为"false"）。

## JavaScript

JavaScript有两个关键字，`true`和`false`，两者都为小写。JavaScript是一种弱类型的语言，没有明确的布尔数据类型供其变量使用。但是许多值用在逻辑上下文时可以被当成`false`，包括零（`0`）、`null`、零长度字符串（`""`）、`NaN`以及`undefined`。所有其他变量值，包括一（`1`）、空数组和空对象，都被认为是`true`。JavaScript 提供了一个`Boolean` 对象，可以被用作控制布尔值的容包装。

```javascript
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`值。

```javascript
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，则视同将参数转为布林值

```javascript
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`。

```ocaml
# 1 = 1 ;;
- : bool = true
```

和很多其它的语言一样，Ocaml使用 `true` 或 `false`关键字来表示布林值。

## Pascal

`Boolean`是Pascal提供的基本数据类型，定义和用法如下：

```pascal
(* 系统或标准声明 *)
Type 
   Boolean = (False,True);

(* 用法 *)
var
  value: Boolean;
 
...
 
value := True;
value := False;
 
if value then
begin
  ...
end;
```

## Swift

Swift的布林型别是 `Bool`，主要用于 if 和 while 的条件判断，值只能是真`true`或假`false`。

```swift
let isSuccess = true
let isOpenDoor = false
```

枚举外的值没有被定义。某些编译器实现（如Delphi）为了接口目的拥有特殊的扩展布尔类型，并将其映射到C数值类型上，例如bytebool、wordbool、longbool等。