Циклы Zig
В Zig конструкции циклов включаютwhileциклы иforциклы. Каждый цикл имеет свой специфический синтаксис и применение. Ниже подробно описаны обе конструкции циклов, включая их синтаксис, описание и примеры.
1, whileЦиклы
Синтаксис
while (condition) : (increment) {
// code block
}
condition: логическое выражение. Пока оноtrue, цикл будет продолжать выполняться.increment(необязательно): выражение, выполняемое после завершения каждой итерации цикла.
Описание
whileЦикл проверяет условие перед каждой итерацией. Если условиеtrue, он выполняет код в теле цикла. После завершения тела цикла выполняетсяincrementвыражение (если есть). Затем снова проверяется условие, пока оно неfalse。
Пример
Пример
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, и выполняется код в теле цикла.
Пример
Пример
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используется для завершения всего цикла.
Пример
Пример
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
}
}
Описание
Цикл, содержащий в своем теле другой цикл, называется вложенным циклом. Внутренний цикл выполняется на каждой итерации внешнего цикла.
Пример
Пример
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, если условие всегда истинно:
Пример
while (true) {
// Блок кода
// Должен содержать какой-либо механизм выхода, иначе программа будет выполняться бесконечно
}
}
Цикл по диапазону
Zig также позволяет выполнять цикл по диапазонам, что в некоторых случаях может упростить код:
Пример
for (0..10) |i| {
std.debug.print("i: {}\n", .{i});
}
}
Цикл с меткой
Zig поддерживает циклы с метками, позволяя давать циклам имена, что очень полезно во вложенных циклах:
Пример
loop: while (true) {
while (true) {
std.debug.print("Внутри вложенного цикла\n");
break :loop; // Выход из внешнего цикла
}
}
}