Zig 循环
在 Zig 中,循环结构包括 while
循环和 for
循环。每种循环都有其特定的语法和用法。下面详细介绍这两种循环结构,包括其语法、说明和实例。
1、while
循环
语法
while (condition) : (increment) { // code block }
condition
:一个布尔表达式,只要它为true
,循环就会继续执行。increment
(可选):一个在每次循环结束后执行的表达式。
说明
while
循环在每次迭代前检查条件。如果条件为 true
,则执行循环体中的代码。循环体执行完毕后,执行 increment
表达式(如果有)。然后再次检查条件,直到条件为 false
。
实例
实例
const std = @import("std");
pub fn main() void {
var i: i32 = 0;
while (i < 5) : (i += 1) {
std.debug.print("i: {}\n", .{i});
}
}
pub fn main() void {
var i: i32 = 0;
while (i < 5) : (i += 1) {
std.debug.print("i: {}\n", .{i});
}
}
解析:
- 初始化变量
i
为 0。 - 只要
i
小于 5,循环体就会执行。 - 每次循环结束后,
i
自增 1。
代码编译执行结果为:
i: 0 i: 1 i: 2 i: 3 i: 4
2、for
循环
语法
for (collection) |item, index| { // code block }
collection
:一个数组、切片或其他可迭代的集合。item
:在每次迭代中,集合的当前元素。index
(可选):当前元素的索引。
说明
for
循环用于遍历一个集合中的每个元素。在每次迭代中,集合的当前元素被赋值给 item
,并执行循环体中的代码。
实例
实例
const std = @import("std");
pub fn main() void {
const array = [5]i32{ 1, 2, 3, 4, 5 };
var index: usize = 0; // 索引变量需要声明类型
for (array) |item| {
std.debug.print("index: {}, item: {}\n", .{ index, item });
index += 1; // 更新索引
}
}
pub fn main() void {
const array = [5]i32{ 1, 2, 3, 4, 5 };
var index: usize = 0; // 索引变量需要声明类型
for (array) |item| {
std.debug.print("index: {}, item: {}\n", .{ index, item });
index += 1; // 更新索引
}
}
解析:
- 定义了一个包含 5 个整数的数组。
- 使用
for
循环遍历数组中的每个元素,并将元素值赋给item
,索引赋给index
。 - 在循环体中,打印每个元素的值和索引。
代码编译执行结果为:
index: 0, item: 1 index: 1, item: 2 index: 2, item: 3 index: 3, item: 4 index: 4, item: 5
3、continue
和 break
语法
continue
:跳过当前迭代并继续下一次迭代。break
:终止循环。
说明
continue
用于跳过当前迭代中剩余的代码,并立即开始下一次迭代。break
用于终止整个循环。
实例
实例
const std = @import("std");
pub fn main() void {
var i: i32 = 0;
while (i < 10) : (i += 1) {
if (i == 5) {
continue; // 跳过 i 等于 5 的那次迭代
}
if (i == 8) {
break; // 终止循环
}
std.debug.print("i: {}\n", .{i});
}
}
pub fn main() void {
var i: i32 = 0;
while (i < 10) : (i += 1) {
if (i == 5) {
continue; // 跳过 i 等于 5 的那次迭代
}
if (i == 8) {
break; // 终止循环
}
std.debug.print("i: {}\n", .{i});
}
}
解析:
- 当
i
等于 5 时,continue
跳过该次迭代。 - 当
i
等于 8 时,break
终止循环。
代码编译执行结果为:
i: 0 i: 1 i: 2 i: 3 i: 4 i: 6 i: 7
5、嵌套循环
语法
for (outer_collection) |outer_item| { for (inner_collection) |inner_item| { // code block } }
说明
在一个循环体内包含另一个循环称为嵌套循环。外层循环的每次迭代中,都会执行内层循环。
实例
实例
const std = @import("std");
pub fn main() void {
// 声明一个包含三个字符串的数组
const letters = [_][]const u8{ "A", "B", "C" };
// 遍历数组
for (letters) |letter| {
var count: i32 = 0; // 声明计数器
// 使用 while 循环来打印每个字母和计数
while (count < 3) : (count += 1) {
std.debug.print("{s} - {}\n", .{ letter, count });
}
}
}
pub fn main() void {
// 声明一个包含三个字符串的数组
const letters = [_][]const u8{ "A", "B", "C" };
// 遍历数组
for (letters) |letter| {
var count: i32 = 0; // 声明计数器
// 使用 while 循环来打印每个字母和计数
while (count < 3) : (count += 1) {
std.debug.print("{s} - {}\n", .{ letter, count });
}
}
}
解析:
- 外层
for
循环遍历字母数组。 - 内层
while
循环执行 3 次,打印字母和计数。
代码编译执行结果为:
A - 0 A - 1 A - 2 B - 0 B - 1 B - 2 C - 0 C - 1 C - 2
6、更多循环
无限循环
可以使用 while 循环创建一个无限循环,只要条件始终为真:
实例
pub fn main() void {
while (true) {
// 代码块
// 必须包含某种退出机制,否则程序将永远运行
}
}
while (true) {
// 代码块
// 必须包含某种退出机制,否则程序将永远运行
}
}
范围循环
Zig 还允许你使用范围来循环,这在某些情况下可以简化代码:
实例
pub fn main() void {
for (0..10) |i| {
std.debug.print("i: {}\n", .{i});
}
}
for (0..10) |i| {
std.debug.print("i: {}\n", .{i});
}
}
标签循环
Zig 支持标签循环,允许你命名循环,这在嵌套循环中非常有用:
实例
pub fn main() void {
loop: while (true) {
while (true) {
std.debug.print("Inside nested loop\n");
break :loop; // 退出外部循环
}
}
}
loop: while (true) {
while (true) {
std.debug.print("Inside nested loop\n");
break :loop; // 退出外部循环
}
}
}