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

const std = @import("std");

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 iia 0.
  • Mientrasii 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

const std = @import("std");

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 bucleforfor 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

const std = @import("std");

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:

  • CuandoiCuando i es igual a 5,continuecontinue omite esa iteración.
  • CuandoiCuando 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

const std = @import("std");

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 exteriorforfor recorre el array de letras.
  • El bucle interiorwhilewhile 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

pub fn main() void {
    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

pub fn main() void {
    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

pub fn main() void {
    loop: while (true) {
        while (true) {
            std.debug.print("Inside nested loop\n");
            break :loop; // Salir del bucle exterior
        }
    }
}
Otras extensiones