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 表达式

if 表达式用于进行选择。

关键字 if 会测试一个表达式,以查看它是否为 truefalse,并根据结果执行相应的操作。一个真或假的表达式被称为 布尔表达式,这个概念来源于数学家 George Boole,他发明了这些表达式背后的逻辑。以下是使用 >(大于)和 <(小于)符号的示例:

// IfExpressions/If1.kt

fun main() {
  if (1 > 0)
    println("It's true!")
  if (10 < 11) {
    println("10 < 11")
    println("ten is less than eleven")
  }
}
/* 输出:
It's true!
10 < 11
ten is less than eleven
*/

if 后的括号中的表达式必须评估为 truefalse。如果为 true,则执行后续的表达式。要执行多行代码,将它们放在花括号内。

我们可以在一个地方创建布尔表达式,并在另一个地方使用它:

// IfExpressions/If2.kt

fun main() {
  val x: Boolean = 1 >= 1
  if (x)
    println("It's true!")
}
/* 输出:
It's true!
*/

因为 x 是布尔类型,所以可以直接使用 if(x) 来测试。

布尔运算符 >= 返回 true,如果操作符左侧的表达式大于等于右侧的表达式。同样,<= 返回 true,如果左侧的表达式小于等于右侧的表达式。

else 关键字允许处理 truefalse 两种情况:

// IfExpressions/If3.kt

fun main() {
  val n: Int = -11
  if (n > 0)
    println("It's positive")
  else
    println("It's negative or zero")
}
/* 输出:
It's negative or zero
*/

else 关键字只能与 if 结合使用。你不仅限于单个检查,你可以通过组合 elseif 来测试多个组合:

// IfExpressions/If4.kt

fun main() {
  val n: Int = -11
  if (n > 0)
    println("It's positive")
  else if (n == 0)
    println("It's zero")
  else
    println("It's negative")
}
/* 输出:
It's negative
*/

在这里,我们使用 == 来检查两个数字是否相等。!= 用于测试不等式。

通常的模式是从 if 开始,后面跟着所需数量的 else if 子句,最后以最终的 else 结束,用于处理不符合所有先前测试的情况。当 if 表达式变得越来越大和复杂时,你可能会改用 when 表达式。when 表达式将在本书后面的 when 表达式 部分中进行描述。

“非”运算符 ! 用于测试布尔表达式的相反情况:

// IfExpressions/If5.kt

fun main() {
  val y: Boolean = false
  if (!y)
    println("!y is true")
}
/* 输出:
!y is true
*/

要将 if(!y) 转化为口语,可以说 “if not y”。

整个 if 是一个表达式,因此它可以产生一个结果:

// IfExpressions/If6.kt

fun main() {
  val num = 10
  val result = if (num > 100) 4 else 42
  println(result)
}
/* 输出:
42
*/

在这里,我们将整个 if 表达式产生的值存储在一个中间标识符中,称为 result。如果条件满足,则第一个分支产生 result。如果不满足条件,则 else 值变为 result

让我们练习创建函数。以下是一个接受布尔参数的函数:

// IfExpressions/TrueOrFalse.kt

fun trueOrFalse(exp: Boolean): String {
  if (exp)
    return "It's true!"          // [1]
  return "It's false"            // [2]
}

fun main() {
  val b = 1
  println(trueOrFalse(b < 3))
  println(trueOrFalse(b >= 3))
}
/* 输出:
It's true!
It's false
*/

布尔参数 exp 被传递给函数 trueOrFalse()。如果参数作为表达式传递,比如 b < 3,那么表达式会首先被求值,然后将结果传递给函数。trueOrFalse() 测试 exp,如果结果为 true,则执行 [1] 行,否则执行 [2] 行。

  • [1] return 表示,“离开函数并以此值作为函数的结果”。请注意,return 可以出现在函数中的任何位置,不必在结尾处。

与前面的示例不同,你可以使用 else 关键字将结果作为表达式生成:

// IfExpressions/OneOrTheOther.kt

fun oneOrTheOther(exp: Boolean): String =
  if (exp)
    "True!" // 不需要 'return'
  else
    "False"

fun main() {
  val x = 1
  println(oneOrTheOther(x == 1))
  println(oneOrTheOther(x == 2))
}
/* 输出:
True!
False
*/

trueOrFalse() 中使用了两个表达式,而 oneOrTheOther() 是一个单一表达式。该表达式的结果成为函数的结果,因此 if 表达式成为函数体。

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