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 = 0
var a = 10
var b = 9
if (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)") ⑧
上述代码运行输出结果如下:
或运算为 true
i = 0
与运算为 false
i = 0
其中,第①行代码是进行短路或计算,由于(a > b)
是true
,后面的表达式(i++ == 1)
不再计算,因此结果i
不会加一,第④行输出的结果为i = 0
。如果我们把第①行短路或换成逻辑或,结果则是i = 1
。
类似地,第⑤行代码是进行短路与计算,由于(a < b)
是false
,后面的表达式(i++ == 1)
不再计算,因此结果i
不会加一,第⑧行输出的结果为i = 0
。如果我们把第⑤行短路与换成逻辑与,结果则是i = 1
。