diff --git a/course/basic/process_control/loop.md b/course/basic/process_control/loop.md index aa098c97..d29459d7 100644 --- a/course/basic/process_control/loop.md +++ b/course/basic/process_control/loop.md @@ -98,7 +98,26 @@ for 循环是另一种循环处理方式,主要用于迭代数组和切片。 ### `continue` 表达式 -`while` 循环还支持一个被称为 `continue` 表达式的机制,以便于我们控制循环。其内部可以是一个语句或一个代码块(由 `{}` 包裹)。 +`while` 循环的条件之后可以用冒号 `:` 跟一个括号来声明 **`continue` 表达式**,它会在**每轮循环体结束后、下一轮条件判断之前**自动执行: + +<<<@/code/release/loop.zig#while_continue_fix + +每轮循环的执行顺序是: + +1. 检查条件 `i < 10` +2. 执行循环体 +3. 执行 `continue` 表达式 `i += 1` +4. 回到第 1 步 + +相信看到这里,细心的读者可能已经发现了,在上面的 while 基本使用示例中,当循环执行到 `i == 5` 时,**代码会陷入死循环**。 + +而 `continue` 表达式会帮助我们完美地避开这个问题,不难发现,即使循环执行到 `i == 5` 时,`i` 的自增仍然会在 `continue` 表达式内执行。 + +:::info 🅿️ 提示 +除了 break 以外,return 也会导致 continue 表达式不执行,因为它们都会直接跳出循环。 +::: + +另外,`continue` 表达式可以是单个语句,也可以是多个语句(用 `{}` 包裹),示例如下: :::code-group diff --git a/course/code/15/loop.zig b/course/code/15/loop.zig index 2f0c520f..ab2b194a 100644 --- a/course/code/15/loop.zig +++ b/course/code/15/loop.zig @@ -171,7 +171,20 @@ const WhileBasic = struct { }; const WhileContinue = struct { + const std = @import("std"); + pub fn main() void { + { + // #region while_continue_fix + // 将while语句的基础代码用continue表达式改写 + var i: usize = 0; + while (i < 10) : (i += 1) { + if (i == 5) continue; + std.debug.print("i is {}\n", .{i}); + } + // #endregion while_continue_fix + } + { // #region while_continue_1 var i: usize = 0;