Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

布尔类型

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
*/

布尔表达式是 sunnytemp > 50exercisehoursSleep > 7。我们将 happy1 理解为:“天晴 并且 温度大于 50 或者 我已经锻炼并且睡了超过 7 小时。”但是 &&|| 前还是后,哪一个运算符的优先级更高呢?

[1] 中的表达式使用了 Kotlin 的默认评估顺序。这产生了与 [2] 中的表达式相同的结果,因为没有括号,逻辑“与”先于逻辑“或”进行计算。[3] 中的表达式使用括号产生了不同的结果。在 [3] 中,只有在睡眠超过 7 小时时我们才会感到高兴。

练习和解答可在 www.AtomicKotlin.com 找到。