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});
    }
}

解析:

  • 初始化变量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; // 更新索引
    }
}

解析:

  • 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});
    }
}

解析:

  • 当 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 });
        }
    }
}

解析:

  • 外层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) {
        // 代码块
        // 必须包含某种退出机制,否则程序将永远运行
    }
}

范围循环

Zigでは、範囲を使用してループすることもでき、これにより状況によってはコードを簡素化できます:

实例

pub fn main() void {
    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; // 退出外部循环
        }
    }
}
其他扩展