布尔逻辑
  第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 来说,可能出现后一种情形,也是可以检测到的)。
读者此时可能会问,为什么会有
&和|运算符。原因是这两个运算符可用于对数值执行操作。实际上,它们处理的是存储在变量中的一些列位,而不是变量的值。请参见稍后的 “按位运算符”。
🔚