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)的概念。