布尔逻辑
第3章介绍的 bool
类型可以有两个值:true
或 false
。这种类型常用于记录某些操作的结果,以便操作这些结果。特别是,bool
类型可用于存储比较的结果。
19世纪中叶的英国数学家乔治∙布尔为布尔逻辑奠定了基础。
考虑下述情形(如本章引言所述):要根据变量 myVal
是否小于 10,来确定是否执行代码。为此,需要确定语句 “myVal 小于10” 的真假,即需要了解比较的布尔结果。
布尔比较需要使用布尔比较运算符(也称为关系运算符),如表 4-1 所示
。
表4-1 布尔比较运算符
运算符 | 类别 | 示例表达式 | 结果 |
---|---|---|---|
= | 二元 | var1 = var2 == var3; | 如果 var2 等于 var3 ,var1 的值就是 true ,否则为 false 。 |
!= | 二元 | var1 = var2 != var3; | 如果 var2 不等于 var3 ,var1 的值就是 true ,否则为 false 。 |
< | 二元 | var1 = var2 < var3; | 如果 var2 小于 var3 ,var1 的值就是 true ,否则为 false 。 |
> | 二元 | var1 = var2 > var3; | 如果 var2 大于 var3 ,var1 的值就是 true ,否则为 false 。 |
<= | 二元 | var1 = var2 <= var3; | 如果 var2 小于等于 var3 ,var1 的值就是 true ,否则为 false 。 |
>= | 二元 | var1 = var2 >= var3; | 如果 var2 大于等于 var3 ,var1 的值就是 true ,否则为 false 。 |
在表4-1
中,var1
都是bool
类型的变量,var2
和var3
则可以是不同类型。
在代码中,可以对数值使用这些运算符:
bool isLessThan10;
isLessThan10 = myVal < 10;
如果 myVal
存储的值小于 10,这段代码就给 isLessThan10
赋予 true
值,否则赋予 false
值。
也可以对其他类型使用这些比较运算符,例如字符串:
bool isKarli;
isKarli = myString == "Karli";
如果 myString
存储的字符串是 Karli
,isKarli
的值就为 true
。
也可以对布尔值使用这些运算符:
bool isTrue;
isTrue = myBool == true;
- 但只能使用
==
和!=
运算符。
一个常见的代码错误是,无意间假定由于val1 < var2
是false
,所以val1 > var2
为true
。如果var1 == var2
,则这两个语句都是false
。
在处理布尔值时,还有其他一些布尔运算符,如表 4-2 所示
。
表4-2 处理布尔值的布尔运算符
运算符 | 类别 | 示例表达式 | 结果 | |
---|---|---|---|---|
! | 一元 | var1 = !var2; | 如果 var2 是 false ,var1 的值就是 true ,否则为 false (逻辑非) | |
& | 二元 | var1 = var2 & var3; | 如果 var2 和 var3 都是 true ,var1 的值就是 true ,否则为 false (逻辑与) | |
| | 二元 | var1 = var2 \ | var3; | 如果 var2 或 var3 是 true (或两者都是),var1 的值就是 true ,否则为 false (逻辑或) |
^ | 二元 | var1 = var2 ^ var3; | 如果 var2 或 var3 中有且仅有一个 true ,var1 的值就是 true ,否则为 false (逻辑异或) |
上面的代码也可以表述为:
bool isTrue;
isTrue = myBool & true;
&
和 |
运算符也有两个类似的运算符,称为条件布尔运算符(见 表 4-3
)。
表4-3 条件布尔运算符
运算符 | 类别 | 示例表达式 | 结果 | ||
---|---|---|---|---|---|
&& | 二元 | var1 = var2 && var3; | 如果 var2 和 var3 都是 true ,否则为 false (逻辑与) | ||
|| | 二元 | var1 = var2 \ | \ | var3; | 如果 var2 或 var3 是 true (或两者都是),var1 的值就是 true ,否则为 false (逻辑或) |
如果 &&
运算符的第一个操作数是 false
,就不需要考虑第二个操作数的值了,因为无论第二个操作数的值是什么,其结果都是 false
。同样,如果第一个操作数是 true
,||
运算符就返回 true
,不必考虑第二个操作数的值。但上面的 &
和 |
运算符却不是这样。它们总是要计算两个操作数。
因为操作数的计算是有条件的,如果用 &&
和 ||
运算符来替代 &
和 |
,性能会有一定提高。在大量使用这些运算符的应用程序中这表现得尤为明显。作为一个经验法则,尽可能使用 &&
和 ||
运算符。这些运算符有时用于比较复杂的情形,例如,只有第一个操作数包含某个值时,才计算第二个操作数:
var1 = (var2 != 0) && (var3 / var2 > 2);
如果 var2
是 0,则 var3
除以 var2
就会导致 “除0错误”,或者把 var1
定义为无穷大(对于某些类型如 float
来说,可能出现后一种情形,也是可以检测到的)。
读者此时可能会问,为什么会有&
和|
运算符。原因是这两个运算符可用于对数值执行操作。实际上,它们处理的是存储在变量中的一些列位,而不是变量的值。请参见稍后的 “按位运算符”。