Ziglings 笔记 12: While 循环的高级形态
进化的 While 循环
在上一篇笔记中,我们写了一个标准的 while 循环来计算指数。在 Ziglings 的第 12 个练习中,我们遇到了 while 语句的一个变体,它让代码看起来更加紧凑且安全。
挑战:分离逻辑与步进
在之前的代码中,我们将 n *= 2 放在了循环体的最后一行。这在简单代码中没问题,但如果循环体很长,或者中间有 continue 语句,我们很容易忘记更新变量,从而导致死循环。
Zig 提供了一种语法,允许我们将“更新逻辑”从“业务逻辑”中分离出来。
解决方案
这是使用 Continue Expression 重写后的代码:
const std = @import("std");
pub fn main() void {
var n: u32 = 2;
// 注意这里的 : (n *= 2)
// 这部分代码会在每次循环结束后自动执行
while (n < 1000) : (n *= 2) {
// 循环体内部现在只负责打印,逻辑更纯粹
std.debug.print("{} ", .{n});
}
std.debug.print("n={}\n", .{n});
}
核心知识点总结
1. 语法结构
while (condition) : (continue_expression) {
// 循环体
}
这实际上是 C 语言中 for (;; step) 的 Zig 版本。
2. 执行顺序
- 检查
condition。 - 如果为真,执行
{ 循环体 }。 - 执行
continue_expression(例如n *= 2)。 - 回到第 1 步。
3. 为什么不直接用 for?
Zig 的 for 循环主要用于迭代(Iteration),例如遍历数组或切片。如果你只是想进行纯粹的数学运算循环(比如 n 每次乘以 2),带步进表达式的 while 是更地道(Idiomatic)的写法。
后续预告:既然提到了 continue 表达式,那肯定少不了 continue 语句。下一篇我们将看看如何用 continue 提前跳过本次循环。