4.3 逻辑运算符
逻辑运算符是对布尔型变量进行运算,其结果也是布尔型,具体说明参见表4-5。
表4-5 关系运算符
| 运算符 | 名称 | 例子 | 说明 | 可应用的类型 |
|---|---|---|---|---|
!
| 逻辑反 |
!a
|
a为true时,值为false,a为false时,值为true
| 布尔型 |
&&
| 短路与 |
a&&b
|
ab全为true时,计算结果为true,否则为false
| 布尔型 |
||
| 短路或 |
a||b
|
ab全为false时,计算结果为false,否则为true
| 布尔型 |
&&和||都具有短路计算的特点。例如x && y,如果 x 为false,则不计算 y(因为不论 y 为何值,“与”操作的结果都为false)。而对于x || y,如果 x 为true,则不计算 y(因为不论 y 为何值,“或”操作的结果都为true)。
所以,我们把&&称为“短路与”、把||称为“短路或”的原因就是,它们在计算过程中就像电路短路一样采用最优化的计算方式,从而提高了效率。
为了进一步理解它们的区别,我们看看下面的例子:
var i = 0var a = 10var b = 9if (a > b) || (i++ == 1) {// 换成 | 试一下 ①println("或运算为 true") ②} else {println("或运算为 false") ③}println("i = \(i)") ④i = 0;if (a < b) && (i++ == 1) {// 换成 & 试一下 ⑤println("与运算为 true") ⑥} else {println("与运算为 false") ⑦}println("i = \(i)") ⑧
上述代码运行输出结果如下:
或运算为 truei = 0与运算为 falsei = 0
其中,第①行代码是进行短路或计算,由于(a > b)是true,后面的表达式(i++ == 1)不再计算,因此结果i不会加一,第④行输出的结果为i = 0。如果我们把第①行短路或换成逻辑或,结果则是i = 1。
类似地,第⑤行代码是进行短路与计算,由于(a < b)是false,后面的表达式(i++ == 1)不再计算,因此结果i不会加一,第⑧行输出的结果为i = 0。如果我们把第⑤行短路与换成逻辑与,结果则是i = 1。
