4.3 逻辑运算符

逻辑运算符是对布尔型变量进行运算,其结果也是布尔型,具体说明参见表4-5。

表4-5 关系运算符

运算符 名称 例子 说明 可应用的类型
! 逻辑反 !a atrue时,值为falseafalse时,值为true 布尔型
&& 短路与 a&&b ab全为true时,计算结果为true,否则为false 布尔型
|| 短路或 a||b ab全为false时,计算结果为false,否则为true 布尔型

&&||都具有短路计算的特点。例如x && y,如果 xfalse,则不计算 y(因为不论 y 为何值,“与”操作的结果都为false)。而对于x || y,如果 xtrue,则不计算 y(因为不论 y 为何值,“或”操作的结果都为true)。

所以,我们把&&称为“短路与”、把||称为“短路或”的原因就是,它们在计算过程中就像电路短路一样采用最优化的计算方式,从而提高了效率。

为了进一步理解它们的区别,我们看看下面的例子:

  1. var i = 0
  2. var a = 10
  3. var b = 9
  4. if (a > b) || (i++ == 1) {// 换成 | 试一下 ①
  5. println("或运算为 true")
  6. } else {
  7. println("或运算为 false")
  8. }
  9. println("i = \(i)")
  10. i = 0;
  11. if (a < b) && (i++ == 1) {// 换成 & 试一下 ⑤
  12. println("与运算为 true")
  13. } else {
  14. println("与运算为 false")
  15. }
  16. println("i = \(i)")

上述代码运行输出结果如下:

  1. 或运算为 true
  2. i = 0
  3. 与运算为 false
  4. i = 0

其中,第①行代码是进行短路或计算,由于(a > b)true,后面的表达式(i++ == 1)不再计算,因此结果i不会加一,第④行输出的结果为i = 0。如果我们把第①行短路或换成逻辑或,结果则是i = 1

类似地,第⑤行代码是进行短路与计算,由于(a < b)false,后面的表达式(i++ == 1)不再计算,因此结果i不会加一,第⑧行输出的结果为i = 0。如果我们把第⑤行短路与换成逻辑与,结果则是i = 1