流程控制(Control Flow)决定了程序的执行逻辑,包括 条件判断循环跳转错误处理。Zig 语言提供了 ifelsewhileforswitch 等关键字来控制代码的执行路径。


📖 目录

  1. if 条件判断
  2. while 循环
  3. for 循环
  4. switch 多分支判断
  5. break 和 continue
  6. return 终止函数
  7. 错误处理(try、catch、orelse)
  8. 参考资料

1. if 条件判断

if 语句用于执行特定的代码块,当条件为 true 时执行,else 块用于处理 false 情况。

🔹 语法

if (条件) {
    // 条件为 true 时执行
} else {
    // 条件为 false 时执行
}

🔹 示例

const std = @import("std");

pub fn main() void {
    const x = 10;

    if (x > 5) {
        std.debug.print("x 大于 5\n", .{});
    } else {
        std.debug.print("x 小于等于 5\n", .{});
    }
}

输出:

x 大于 5

🔹 if 语句可以返回值

const result = if (x > 5) "大于 5" else "小于等于 5";
std.debug.print("{}\n", .{result});


2. while 循环

while 语句用于基于条件执行循环,适用于 不确定循环次数 的情况。

🔹 示例

var i: i32 = 0;

while (i < 3) {
    std.debug.print("i = {}\n", .{i});
    i += 1;
}

输出:

i = 0
i = 1
i = 2


3. for 循环

for 用于遍历数组、切片等集合,适用于确定次数的循环

🔹 遍历数组

const arr = [_]i32{10, 20, 30};

for (arr) |value| {
    std.debug.print("Value: {}\n", .{value});
}

输出:

Value: 10
Value: 20
Value: 30

🔹 遍历数组(带索引)

for (arr, 0..) |value, index| {
    std.debug.print("Index: {}, Value: {}\n", .{index, value});
}


4. switch 多分支判断

switch 语句用于处理多个条件,避免多个 if-else 嵌套。

🔹 语法

switch (变量) {
    条件1 => { // 代码块 },
    条件2 => { // 代码块 },
    else => { // 默认分支 },
}

🔹 示例

const num: i32 = 2;

switch (num) {
    1 => std.debug.print("One\n", .{}),
    2 => std.debug.print("Two\n", .{}),
    3 => std.debug.print("Three\n", .{}),
    else => std.debug.print("Other\n", .{}),
}

输出:

Two

⚠️ switch 需要覆盖所有情况,否则 Zig 可能报错。如果不确定所有可能值,建议使用 else 分支。


5. breakcontinue

🔹 break 终止循环

var x: i32 = 0;

while (x < 10) {
    if (x == 5) break;
    std.debug.print("x = {}\n", .{x});
    x += 1;
}

输出:

x = 0
x = 1
x = 2
x = 3
x = 4

🔹 continue 跳过本次循环

var i: i32 = 0;

while (i < 5) {
    i += 1;
    if (i == 3) continue;
    std.debug.print("i = {}\n", .{i});
}

输出:

i = 1
i = 2
i = 4
i = 5


6. return 终止函数

return 语句用于终止当前函数并返回值

🔹 示例

fn add(a: i32, b: i32) i32 {
    return a + b;
}

如果 return 被省略,Zig 会根据函数返回类型推导返回值


7. 错误处理 (trycatchorelse)

Zig 没有异常(Exception),但提供 error 类型来表示错误,并使用 trycatchorelse 处理错误。

🔹 try 传播错误

fn readFile() !void {
    return error.FileNotFound;
}

pub fn main() !void {
    try readFile(); // 如果 `readFile` 失败,则 main 也返回错误
}

🔹 catch 处理错误

fn divide(a: i32, b: i32) !i32 {
    if (b == 0) return error.DivideByZero;
    return a / b;
}

const result = divide(10, 0) catch |err| {
    std.debug.print("Error: {}\n", .{err});
    return;
};

输出:

Error: error.DivideByZero

🔹 orelse 提供默认值

const value = divide(10, 0) orelse -1;
std.debug.print("Result: {}\n", .{value});

输出:

Result: -1


8. 参考资料


🔹 总结

关键字作用
if-else进行条件判断
while条件循环
for遍历集合
switch多分支判断
break终止循环
continue跳过当前循环
return终止函数
try传播错误
catch处理错误
orelse提供默认值

Zig 提供灵活的流程控制结构,推荐使用 if 进行条件判断for 进行数据遍历switch 处理多条件分支,并结合 错误处理机制 让代码更加健壮! 🚀