Циклы 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});
    }
}

Анализ:

  • Инициализировать переменную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; // Обновить index
    }
}

Анализ:

  • Определяет массив из 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});
    }
}

Анализ:

  • Когда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 });
        }
    }
}

Анализ:

  • Внешний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("Внутри вложенного цикла\n");
            break :loop; // Выход из внешнего цикла
        }
    }
}
Другие расширения