布尔类型
if
表达式 展示了“非”操作符!
,它会对布尔值进行取反。本节介绍更多的布尔代数知识。
我们从“与”和“或”操作符开始:
&&
(与):仅当操作符左侧和右侧的布尔表达式都为true
时,产生true
。||
(或):当操作符左侧或右侧的表达式为true
时,或两者都为true
时,产生true
。
在这个例子中,我们根据 hour
判断一个商店是开还是关:
// Booleans/Open1.kt
fun isOpen1(hour: Int) {
val open = 9
val closed = 20
println("营业时间:$open - $closed")
val status =
if (hour >= open && hour <= closed) // [1]
true
else
false
println("是否开门:$status")
}
fun main() = isOpen1(6)
/* 输出:
营业时间:9 - 20
是否开门:false
*/
main()
是一个单一的函数调用,因此我们可以使用表达式体,就像 函数 中描述的那样。
在 [1] 中的 if
表达式检查 hour
是否在开门时间和关门时间之间,因此我们使用布尔 &&
(与)将这些表达式组合在一起。
if
表达式可以被简化。表达式 if(cond) true else false
的结果就是 cond
:
// Booleans/Open2.kt
fun isOpen2(hour: Int) {
val open = 9
val closed = 20
println("营业时间:$open - $closed")
val status = hour >= open && hour <= closed
println("是否开门:$status")
}
fun main() = isOpen2(6)
/* 输出:
营业时间:9 - 20
是否开门:false
*/
让我们反过来,检查商店当前是否关门。逻辑运算符“或” ||
当至少满足一个条件时产生 true
:
// Booleans/Closed.kt
fun isClosed(hour: Int) {
val open = 9
val closed = 20
println("营业时间:$open - $closed")
val status = hour < open || hour > closed
println("是否关门:$status")
}
fun main() = isClosed(6)
/* 输出:
营业时间:9 - 20
是否关门:true
*/
布尔运算符可以在简洁的表达式中实现复杂的逻辑。然而,事情很容易变得混乱。追求可读性,明确指明你的意图。
下面是一个复杂的布尔表达式的例子,不同的评估顺序会产生不同的结果:
// Booleans/EvaluationOrder.kt
fun main() {
val sunny = true
val hoursSleep = 6
val exercise = false
val temp = 55
// [1]:
val happy1 = sunny && temp > 50 ||
exercise && hoursSleep > 7
println(happy1)
// [2]:
val sameHappy1 = (sunny && temp > 50) ||
(exercise && hoursSleep > 7)
println(sameHappy1)
// [3]:
val notSame =
(sunny && temp > 50 || exercise) &&
hoursSleep > 7
println(notSame)
}
/* 输出:
true
true
false
*/
布尔表达式是 sunny
、temp > 50
、exercise
和 hoursSleep > 7
。我们将 happy1
理解为:“天晴 并且 温度大于 50 或者 我已经锻炼并且睡了超过 7 小时。”但是 &&
在 ||
前还是后,哪一个运算符的优先级更高呢?
[1] 中的表达式使用了 Kotlin 的默认评估顺序。这产生了与 [2] 中的表达式相同的结果,因为没有括号,逻辑“与”先于逻辑“或”进行计算。[3] 中的表达式使用括号产生了不同的结果。在 [3] 中,只有在睡眠超过 7 小时时我们才会感到高兴。
练习和解答可在 www.AtomicKotlin.com 找到。