跳转到内容

Kotlin While循环

来自代码酷


Kotlin While循环是控制流中的基本结构之一,允许在满足特定条件时重复执行代码块。与`for`循环不同,`while`循环不依赖集合或范围,而是基于布尔表达式动态控制循环的执行。本章将详细介绍`while`和`do-while`循环的语法、工作原理及实际应用。

基本语法[编辑 | 编辑源代码]

Kotlin提供了两种`while`循环变体:

  • `while`循环:先检查条件,再执行循环体。
  • `do-while`循环:先执行循环体,再检查条件(至少执行一次)。

`while`循环[编辑 | 编辑源代码]

语法格式如下:

while (condition) {
    // 循环体代码
}

执行流程: 1. 检查条件是否为`true`。 2. 若为`true`,执行循环体,然后返回步骤1;否则退出循环。

flowchart TD A[开始] --> B{条件为真?} B -- 是 --> C[执行循环体] C --> B B -- 否 --> D[结束]

示例:计算1到5的和

fun main() {
    var sum = 0
    var i = 1
    while (i <= 5) {
        sum += i
        i++
    }
    println("Sum: $sum") // 输出: Sum: 15
}

`do-while`循环[编辑 | 编辑源代码]

语法格式如下:

do {
    // 循环体代码
} while (condition)

关键区别:循环体至少执行一次,即使条件初始为`false`。

示例:用户输入验证

fun main() {
    var input: String
    do {
        print("Enter 'quit' to exit: ")
        input = readLine() ?: ""
    } while (input != "quit")
}

循环控制语句[编辑 | 编辑源代码]

  • `break`:立即退出整个循环。
  • `continue`:跳过当前迭代,进入下一次循环检查。

示例:在`while`循环中使用`break`

fun main() {
    var x = 0
    while (x++ < 100) {
        if (x == 5) break
        println(x)
    }
    // 输出: 1 2 3 4
}

实际应用场景[编辑 | 编辑源代码]

场景1:游戏循环[编辑 | 编辑源代码]

在游戏开发中,`while`循环常用于主游戏循环:

var isGameRunning = true
while (isGameRunning) {
    updateGameState()
    renderGraphics()
    isGameRunning = checkPlayerStatus()
}

场景2:数据处理[编辑 | 编辑源代码]

读取文件直到结束:

val reader = File("data.txt").bufferedReader()
var line: String?
while (reader.readLine().also { line = it } != null) {
    processLine(line!!)
}

数学表达与循环[编辑 | 编辑源代码]

`while`循环可用于实现数值逼近算法,如计算平方根(牛顿迭代法): xn+1=12(xn+Sxn)

fun sqrt(S: Double): Double {
    var x = S
    var prev = 0.0
    while (Math.abs(x - prev) > 1e-6) {
        prev = x
        x = 0.5 * (x + S / x)
    }
    return x
}

常见问题[编辑 | 编辑源代码]

问题 解决方案
无限循环 确保循环条件最终变为`false`
未初始化变量 在循环外正确初始化控制变量
逻辑错误 使用`println`调试循环变量

性能考虑[编辑 | 编辑源代码]

  • 避免在循环条件中执行复杂计算(如函数调用),应预先计算或缓存结果。
  • 对于确定次数的迭代,优先使用`for`循环。

进阶技巧[编辑 | 编辑源代码]

  • 结合标签实现嵌套循环控制:
outer@ while (condition1) {
    while (condition2) {
        if (check()) break@outer
    }
}
  • 使用`generateSequence`实现函数式替代:
generateSequence(1) { it + 1 }
    .takeWhile { it <= 100 }
    .forEach { println(it) }