Bucles Zig
En Zig, las estructuras de bucle incluyenwhileel bucle while yforel bucle for. Cada bucle tiene su sintaxis y uso específicos.
1, whileBucle while
Sintaxis
while (condition) : (increment) {
// code block
}
conditioncondition: una expresión booleana, siempre que seatruetrue, el bucle continuará ejecutándose.incrementstep (opcional): una expresión que se ejecuta al final de cada iteración del bucle.
Explicación
whileEl bucle comprueba la condición antes de cada iteración. Si la condición estruetrue, se ejecuta el código dentro del cuerpo del bucle. Una vez ejecutado el cuerpo del bucle, se ejecuta laincrementexpresión (si existe). Luego vuelve a comprobar la condición hasta que sea false.false。
Ejemplo
Ejemplo
pub fn main() void {
var i: i32 = 0;
while (i < 5) : (i += 1) {
std.debug.print("i: {}\n", .{i});
}
}
Análisis:
- Se inicializa la variable i
ia 0. - Mientras
ii sea menor que 5, el cuerpo del bucle se ejecutará. - Después de cada iteración del bucle,
ii se incrementa en 1.
El resultado de compilar y ejecutar el código es:
i: 0 i: 1 i: 2 i: 3 i: 4
2, forBucle for
Sintaxis
for (collection) |item, index| {
// code block
}
collectionitems: un array, slice u otra colección iterable.itemitem: el elemento actual de la colección en cada iteración.indexindex (opcional): el índice del elemento actual.
Explicación
forEl bucle se usa para recorrer cada elemento de una colección. En cada iteración, el elemento actual de la colección se asigna aitemitem, y se ejecuta el código dentro del cuerpo del bucle.
Ejemplo
Ejemplo
pub fn main() void {
const array = [5]i32{ 1, 2, 3, 4, 5 };
var index: usize = 0; // La variable de índice necesita declarar su tipo
for (array) |item| {
std.debug.print("index: {}, item: {}\n", .{ index, item });
index += 1; // Actualizar el índice
}
}
Análisis:
- Se define un array que contiene 5 enteros.
- Se utiliza el bucle
forfor para recorrer cada elemento del array, y se asigna el valor del elemento aitemitem, y el índice aindex。 - index. En el cuerpo del bucle, se imprime el valor y el índice de cada elemento.
El resultado de compilar y ejecutar el código es:
index: 0, item: 1 index: 1, item: 2 index: 2, item: 3 index: 3, item: 4 index: 4, item: 5
3, continueybreak
Sintaxis
continuecontinue: omite la iteración actual y continúa con la siguiente iteración.breakbreak: termina el bucle.
Explicación
continuecontinue se utiliza para omitir el código restante de la iteración actual y comenzar inmediatamente la siguiente iteración.breakbreak se utiliza para terminar todo el bucle.
Ejemplo
Ejemplo
pub fn main() void {
var i: i32 = 0;
while (i < 10) : (i += 1) {
if (i == 5) {
continue; // Omitir la iteración en la que i es igual a 5
}
if (i == 8) {
break; // Terminar el bucle
}
std.debug.print("i: {}\n", .{i});
}
}
Análisis:
- Cuando
iCuando i es igual a 5,continuecontinue omite esa iteración. - Cuando
iCuando i es igual a 8,breakbreak termina el bucle.
El resultado de compilar y ejecutar el código es:
i: 0 i: 1 i: 2 i: 3 i: 4 i: 6 i: 7
5. Bucles anidados
Sintaxis
for (outer_collection) |outer_item| {
for (inner_collection) |inner_item| {
// code block
}
}
Explicación
Un bucle que contiene otro bucle dentro de su cuerpo se denomina bucle anidado. En cada iteración del bucle exterior, se ejecuta el bucle interior.
Ejemplo
Ejemplo
pub fn main() void {
// Declarar un array que contiene tres cadenas
const letters = [_][]const u8{ "A", "B", "C" };
// Recorrer el array
for (letters) |letter| {
var count: i32 = 0; // Declarar un contador
// Usar un bucle while para imprimir cada letra y el contador
while (count < 3) : (count += 1) {
std.debug.print("{s} - {}\n", .{ letter, count });
}
}
}
Análisis:
- El bucle exterior
forfor recorre el array de letras. - El bucle interior
whilewhile se ejecuta 3 veces, imprimiendo la letra y el contador.
El resultado de compilar y ejecutar el código es:
A - 0 A - 1 A - 2 B - 0 B - 1 B - 2 C - 0 C - 1 C - 2
6. Más bucles
Bucle infinito
Puedes usar un bucle while para crear un bucle infinito, siempre que la condición sea siempre verdadera:
Ejemplo
while (true) {
// Bloque de código
// Debe contener algún mecanismo de salida; de lo contrario, el programa se ejecutará para siempre
}
}
Bucle de rango
Zig también te permite usar rangos para hacer bucles, lo que puede simplificar el código en algunos casos:
Ejemplo
for (0..10) |i| {
std.debug.print("i: {}\n", .{i});
}
}
Bucle etiquetado
Zig admite bucles etiquetados, lo que te permite nombrar un bucle. Esto es muy útil en bucles anidados:
Ejemplo
loop: while (true) {
while (true) {
std.debug.print("Inside nested loop\n");
break :loop; // Salir del bucle exterior
}
}
}