流程控制(Control Flow)决定了程序的执行逻辑,包括 条件判断、循环、跳转 和 错误处理。Zig 语言提供了 if
、else
、while
、for
、switch
等关键字来控制代码的执行路径。
📖 目录
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. break
和 continue
🔹 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. 错误处理 (try
、catch
、orelse
)
Zig 没有异常(Exception),但提供 error
类型来表示错误,并使用 try
、catch
和 orelse
处理错误。
🔹 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
处理多条件分支,并结合 错误处理机制 让代码更加健壮! 🚀
发表回复