Ziglings 笔记 14: 紧急制动 (Break)

跳出无限循环

在 Ziglings 的第 14 个练习中,我们面对的是一个恐怖的 while (true) —— 无限循环。我们的任务是让它在适当的时候停下来。

这里引入了编程中常用的“紧急出口”:break 语句。

挑战:停在 4

代码使用 while (true) 开启了一个死循环,并配有一个步进表达式 (n += 1)。我们需要在 n 等于 4 的时候让循环停止。

解决方案

这是修复后的代码:

const std = @import("std");

pub fn main() void {
    var n: u32 = 1;

    // while (true) 是 Zig 中标准的无限循环写法
    while (true) : (n += 1) {
        // 当 n 达到 4 时,break 立即终止循环
        if (n == 4) break;
    }

    // 结果: n 保持在 4
    std.debug.print("n={}\n", .{n});
}

核心知识点总结

1. break 的“特权”

我们在前两个练习中学到,即使使用了 continue,步进表达式(n += 1)也依然会执行。 但是 break 不同。 当 break 被触发时,它会立即跳出循环,跳过步进表达式。

2. 执行流程回顾

  • Iter 1: n=1 -> 不是4 -> 步进(n=2)
  • Iter 2: n=2 -> 不是4 -> 步进(n=3)
  • Iter 3: n=3 -> 不是4 -> 步进(n=4)
  • Iter 4: n=4 -> 是4 -> Break! (步进表达式被跳过)
  • 最终结果: n=4

如果 break 也会触发步进表达式的话,最终结果就会变成 5,这显然不是我们想要的。Zig 的这种设计非常符合直觉:说停就停,不再多做一步动作。

3. while (true)

在 C 语言中我们可能会写 while(1),但在 Zig 中必须写 while (true)。这是实现“轮询”或“事件循环”的标准模式。


后续预告:我们已经彻底征服了 while 循环。接下来,我们要通过一个更有趣的 for 循环练习来正式告别循环章节,那将涉及到范围(Range)的概念。