Zig 循环
Zig では、ループ構造には以下が含まれますwhile巡回とforループ。各ループには特定の構文と使用方法があります。以下では、これら 2 つのループ構造について、構文、説明、および例を詳しく紹介します。
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});
}
}
解析:
- 初始化变量
i0です。 - 只要
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});
}
}
解析:
- 当
i5 に等しいとき、continueその回の反復をスキップします。 - 当
i8 に等しいとき、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 {
// 3つの文字列を含む配列を宣言する
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 {
// 3つの文字列を含む配列を宣言する
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; // 退出外部循环
}
}
}