Ziglings 笔记 13: Continue 语句的“安全网”

避免死循环的陷阱

在 Ziglings 的第 13 个练习中,我们终于明白了为什么 Zig 要给 while 循环加上那个独特的“冒号后缀”(步进表达式)。

在编程中,我们经常需要跳过某些特定的迭代,这时就会用到 continue 语句。但在传统的 while 循环中,continue 往往是死循环的罪魁祸首。

挑战:跳过 3 和 5 的倍数

任务是打印 1 到 20 之间的数字,但遇到 3 的倍数或 5 的倍数时要跳过打印。

解决方案

这是利用 Zig 特性写出的安全代码:

const std = @import("std");

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

    // 关键点:步进逻辑 (n += 1) 被放在了 continue 表达式中
    while (n <= 20) : (n += 1) {
        // 取模运算:如果余数为 0,说明是倍数
        if (n % 3 == 0) continue;
        if (n % 5 == 0) continue;
        
        // 只有非倍数才会执行到这一行
        std.debug.print("{} ", .{n});
    }

    std.debug.print("\n", .{});
}

核心知识点总结

1. 步进表达式的真正威力

在这个例子中,当 n 等于 3 时,if (n % 3 == 0) continue; 被触发。

  • 如果这是 C 语言:程序会直接跳回 while 开头,而此时 n 还是 3,条件依然满足,再次进入循环… 导致死循环。
  • 在 Zig 中continue 会先跳转执行 : (n += 1),把 n 变成 4,然后再去检查条件。完美避开了死循环!

2. continue 语句

它的作用是“立即结束本次循环,进入下一轮”。配合 Zig 的语法,它变得既好用又安全。

3. 取模运算符 %

这是数学运算的基础。

  • n % m 返回 n 除以 m 的余数。
  • 常用于 FizzBuzz 类的问题,或者判断奇偶性。

后续预告:While 循环我们已经玩得很溜了。是时候看看 Zig 中的另一种循环方式了——专门用于迭代的 for 循环。