布林 (资料类型)

布林（Boolean）是计算机科学中的逻辑数据类型，以发明布林代数的数学家乔治·布-{}-尔为名。它是只有两种值的原始类型，通常是真和假。布尔数据类型主要与条件语句相关联，条件语句通过根据开发人员指定的条件式，更改程序控制流来允许评估语句的运算值为真或假（即条件成立或不成立)）。这是一种更广泛的逻辑数据类型的特殊情况（参见概率逻辑）－逻辑并不总是只属于布尔类型的。
在一些语言中，布尔数据类型被定义为可代表多于两个真值。例如，ISO SQL:1999标准定义了一个SQL布尔型可以储存三个可能的值：真、假、未知（SQL null被当作未知真值来处理，但仅仅在布尔型中使用）。在此情况下，未知先于真及假，因为布尔型一开始是未有实际值，其值是unknown（也有机会是随机值）而非真。
Ada.
Ada在标准包中定义codice_1为一种枚举类型，有两种值codice_2和codice_3，并且codice_2 < codice_3。
<syntaxhighlight lang="ada">
type Boolean is (False, True);
p : Boolean := True;
if p then
end if;
</syntaxhighlight>
相关的操作（codice_6, codice_7, codice_8, codice_9, codice_10, codice_11）使用语所有的枚举类型，包括codice_1。布尔运算codice_13, codice_14, codice_15和codice_16由codice_1及任意声明的子类型定义。布尔运算也适用于codice_1值数组。
Algol.
Algol 60有codice_1数据类型和相关的操作，定义在Algol 60报告中。这在ALGOL 68中被简化为codice_20。
ALGOL 68语言详细说明（177页）中关于布尔操作定义的原文：
10.2.2. 布尔操作数的运算
C.
在C99之前，C语言的标准没有提供布尔类型，但是这不意味着C90不能表示布尔值的概念。C中的所有布尔运算（&&, ||）以及条件声明（if, while）都以非零值代表真，零值代表假。这样，在其他类型如一个整数或一个枚举中保存布尔值就变得很平常。为了方便，常常为布尔类型创建一个typedef来和一些已存在的数据类型相关联。C99标准也提供了一个内置的布尔类型。
为了说明C中的布尔型，注意以下C代码：
<syntaxhighlight lang="c">
if (my_variable) {
} else {
</syntaxhighlight>
等价于：
<syntaxhighlight lang="c">
if (my_variable != 0) {
} else {
</syntaxhighlight>
简单来说这就是一个整数类型。由于C标准要求codice_21用在指针上下文中时要代表空指针，上面的概念也可以用来检查一个指针是否为空，虽然一些程序风格不建议这样用。这种情况同样适用于浮点值，当比较它们的时候要特别小心，因为它们通常包含四舍五入的结果。通常，整型用来包含布尔变量。
虽然为了测试一个变量的真假值时没必要来命名真或假，但是在给它们分配值的时候却是需要的。（一种方法是使用零值和一，这样做的好处是语言独立。）其他方法，codice_22关键字允许在语言中根据你的选择来命名元素，例如：
<syntaxhighlight lang="c">
typedef enum { FALSE, TRUE } boolean;
boolean b;
</syntaxhighlight>
如下典型的预处理宏经常被使用。
<syntaxhighlight lang="c">
int f = FALSE;
</syntaxhighlight>
有时codice_23可能被定义为-1或~0（位运算0的补）。这意味着在现在常见的二补数计算机架构的整型中所有的位都被设置为1。
但是，在C中任意非零值都代表真就带来了问题，因为codice_23由一个特定的值来表示，因此在其他语言中codice_25只不过是多余的，而在C中，就是错误的代码。
C99.
C99中有codice_20类型，取值为codice_27和codice_28，定义在codice_29头文件中：
<syntaxhighlight lang="c">
bool b = false;
b = true;
</syntaxhighlight>
C++.
C++编程语言在其标准化过程中引入了codice_20、codice_27和codice_28关键字，增加了原生数据类型来支持布尔数据，其大小被实现定义。 codice_20在1993年被引入。.
1998年的C++标准库定义了一个codice_34-{zh-cn:类; zh-tw:类别;}-的特例。为了优化空间，其中的元素被打包，使得每一个布尔变量只使用一位内存。这被认为是一个错误。codice_34不符合STL容器的需要。例如一个codice_36必须为codice_37类型的一个真值左值。这和codice_34的情况不同。类似地，codice_39在解除引用时不产生一个codice_40。在C++标准委员会和库工作组之间有个共识，就是codice_34应该被反对或完全从下一个标准中被移除。
C#.
在C#中，布尔变量通过保留字codice_20来识别，这个保留字是预定义结构类型codice_43的别名，占一字节。在codice_20和其他类型之间不存在标准的转换。此语言还提供了一个布尔类型codice_45，可以表示三种值：codice_27、codice_28和codice_48。这和SQL中布尔表达式的用法类似。
输出一个布尔型的代码如下：
<syntaxhighlight lang="csharp">
bool myBool = (i == 5);
System.Console.WriteLine(myBool ? "I = 5" : "I != 5");
</syntaxhighlight>
Fortran.
在Fortran被标准化之前，于1950年代引入了codice_49关键字和相关的操作codice_50、codice_51、codice_52等等。
<syntaxhighlight lang="fortran">
logical :: bool ! 宣告一个布林变数名称为bool
bool=.true. ! 将变数bool存入值.true.
if (bool) then ! 由于条件为.true.所以进入内部执行
end if
</syntaxhighlight>
Java.
在Java语言中，布尔变量由原始类型codice_53表示。Java虚拟机将实际在内存中的表现抽象，这样JVM开发者可以使用尽可能方便的方式来代表布尔量（例如，一个字节或者一个字）。
Java语言规范不允许任何显式或隐式的从codice_53的转换。这样就需要编译器拒绝如下代码：
<syntaxhighlight lang="java">
int i = 1;
if (i)
else
</syntaxhighlight>
因为整型变量codice_55不能转换为一个布尔型并且codice_56语句需要一个codice_53条件。
在Java中，codice_53值（和其他原始类型相同）可以被附加到字符串。这个特性提供了一个默认的布尔型的可视化表现（codice_27被显示为"true"，codice_28被显示为"false"）。
JavaScript.
JavaScript有两个关键字，codice_27和codice_28，两者都为小写。JavaScript是一种弱类型的语言，没有明确的布尔数据类型供其变量使用。但是许多值用在逻辑上下文时可以被当成codice_28，包括零（codice_21）、codice_48、零长度字符串（codice_66）、codice_67以及codice_68。所有其他变量值，包括一（codice_69）、空数组和空对象，都被认为是codice_27。JavaScript 提供了一个codice_1 对象，可以被用作控制布尔值的容包装。
<syntaxhighlight lang="javascript">
var boolean = true; //设boolean为true
if(boolean && 1){
}else{
</syntaxhighlight>
但如果使用codice_1物件的话，它总是会被当成codice_27，尽管其包含codice_28值。
<syntaxhighlight lang="javascript">
var boolean = new Boolean(false); //设boolean为一个Boolean物件，并设定其内容为false
if(boolean){
}else{
</syntaxhighlight>
若仅使用 codice_75 function，则视同将参数转为布林值
<syntaxhighlight lang="javascript">
var boolean = Boolean(false); //等同于将 boolean 设为 false
if(boolean){
}else{
</syntaxhighlight>
由于JavaScript的历史兼容性和隐性类型转换，空数组（codice_76）、字符“0”的字符串（codice_77）、水平制表字符的字符串（codice_78）互为不宽松等同（codice_79），但都宽松等同（codice_80）于数字0（codice_21），被形容为“JavaScript的三位一体”的迷因。
λ演算.
在λ演算计算模型中，布尔型由Church数表示。
Lisp.
LISP有两个特殊的符号codice_37和codice_83，分别代表了逻辑值真和假。但是，任意非codice_83值都由LISP系统翻译成真。特殊的符号codice_83也用空列表codice_86表示。因此空列表为假，但是任何有数据的列表都为真。这样，什么都没有为假，其他所有都为真。
ML.
和Ocaml类似，ML语言拥有codice_20类型，包含codice_27和codice_28值，例如：
Objective-C.
Objective-C提供了codice_90类型，以及宏codice_91和codice_92。由于Objective-C是C语言的超集，因此C语言的布尔语义也适用。
Ocaml.
Ocaml 拥有一个 codice_20 值，为 codice_27 或 codice_28。
<syntaxhighlight lang="ocaml">
- : bool = true
</syntaxhighlight>
和很多其它的语言一样，Ocaml使用 codice_27 或 codice_28关键字来表示布林值。
Pascal.
codice_1是Pascal提供的基本数据类型，定义和用法如下：
<syntaxhighlight lang="pascal">
Type 
var
value := True;
value := False;
if value then
begin
end;
</syntaxhighlight>
Swift.
Swift的布林型别是 codice_99，主要用于 if 和 while 的条件判断，值只能是真codice_27或假codice_28。
<syntaxhighlight lang="swift">
let isSuccess = true
let isOpenDoor = false
</syntaxhighlight>
枚举外的值没有被定义。某些编译器实现（如Delphi）为了接口目的拥有特殊的扩展布尔类型，并将其映射到C数值类型上，例如bytebool、wordbool、longbool等。