If / Else if / Else

Si tenemos varias condiciones mutuamente excluyentes (es decir, es imposible que las dos sean verdaderas al mismo tiempo) y queremos ejecutar diferentes bloques de código para cada una de ellas, usaremos bloques if / else if.

En este caso, un bloque else adicional sigue siendo opcional: no por usar if / else if estamos obligados a definir también un bloque else, pero podemos hacerlo si queremos cubrir el caso en el cual ninguna de las condiciones se haya cumplido.


if (Expresión booleana 1){

   el código contenido aquí se ejecuta sólo si la Expresión booleana 1 devuelve true 

} else if (Expresión booleana 2){

  el código contenido aquí se ejecuta sólo si la Expresión booleana  2 devuelve true y la anterior devuelve false

} …

 else if (Expresión booleana N){

  se ejecuta sólo si la Expresión booleana N devuelve true y todas las anteriores devuelven false

} else {

     se ejecuta sólo  si todas las expresiones anteriores devuelven false

}



Ampliando el ejemplo anterior, podemos comprobar lo siguiente: aunque el usuario no haya batido el récord de tiempo, tal vez haya batido la puntuación total. Si ninguna de las dos condiciones es cierta mostraremos un mensaje de ánimo:

better_time_score.zig

const std = @import("std");

const print = std.debug.print;

pub fn main() void {

    const n_time_record = 10.0;

    const n_time = 11.0;

    const n_record = 1200;

    const n_score = 3000;

    if (n_time < n_time_record) {

       print("¡Felicidades! Con tu tiempo: {} Has superado el récord anterior ({}).\n", .{ n_time, n_time_record });

    } else if (n_score > n_record) {

      print("Aunque tu tiempo no sea mejor, has conseguido más puntos ({}) que antes ({})\n", .{ n_score, n_record });

    } else {

      print("Sigue intentando mejorar, ni tu tiempo y ni tus puntos han batido el récord previo\n", .{});

    }

 

}

$ zig run better_time_score.zig

Aunque tu tiempo no sea mejor, has conseguido más puntos (3000) que antes (1200).

Podemos añadir tantos else if como queramos. Eso sí - es importante recordar que para que lleguen a ejecutarse, las condiciones de cada uno tienen que ser condiciones mutuamente excluyentes y estar escritas en el orden correcto.

El ejemplo de una condición mal planteada sería el siguiente:

better_score_error.zig

const std = @import("std");

const print = std.debug.print;

pub fn main() void {

   const n_record = 1200;

   const n_score = 5000;

   if (n_record < n_score) {

     print("Tu puntuación {} es mejor que el récord ( {} )\n", .{ n_score, n_record });

   } else if (n_score > 4000) {

     print("Tu puntuación {} es imposible.\n¡Has hecho trampas!\n", .{ n_score });

   }

}

$ zig run better_score_error.zig

Tu puntuación 5000 es mejor que el récord ( 1200 )

Vemos que el supuesto cheater se va a librar, todo porque hemos puesto que la condición que comprueba si la puntuación es imposible está colocada después de la que comprueba si se ha batido el récord. Recuerda: un bloque else if se ejecuta sólo sí todas las condiciones anteriores han devuelto false. Por lo tanto el bloque de código no se va a ejecutar nunca. ¿Ya ves la posible solución?

Cambiando el orden de las condiciones:

if (n_score > 4000) {

  print("Tu puntuación {} es imposible.\n¡Has hecho trampas!\n", .{ n_score });

} else if (n_record < n_score){

  print("Tu puntuación {} es mejor que el récord ( {} )\n", .{ n_score, n_record });

}

Ahora primero evaluamos si la puntuación es imposible y después comprobamos si el récord fue batido. Solo uno de los mensajes será mostrado.

If / Else
Condiciones anidadas
© 2025 Zen of Zig