1. Sintaxis básica de un if anidado
En la vida real, rara vez te encuentras con una situación donde la decisión se toma solo por un criterio. Normalmente tienes que comprobar varias condiciones a la vez, y muchas veces dependen unas de otras. Por ejemplo, para entrar a un concierto, no basta con ser adulto — a veces también tienes que estar en la lista de invitados. Aquí es donde entra en juego la llamada lógica multinivel, y para eso nos ayudan los operadores if anidados.
Las condiciones anidadas son cuando un if vive dentro de otro. Imagínate una caja dentro de otra caja: si la primera caja se abre (la condición se cumple), entonces miramos qué hay dentro y, quizás, abrimos la segunda. Desde el punto de vista del código y la lógica, esto es una herramienta muy potente.
Vamos a empezar con algo sencillo:
if (condiciónA)
{
// acciones si condiciónA es true (verdadero)
if (condiciónB)
{
// acciones si ambas condiciones son verdaderas
}
}
Si esto te recuerda a una matrioshka — ¡lo pillas perfectamente! El if anidado dentro del externo solo se ejecuta si el externo se cumple.
Ejemplo: entrada al club
Vamos a mejorar nuestra app de ejemplo, donde el usuario antes introducía su nombre y edad. Ahora añadimos un segundo nivel de comprobación: imagina que para entrar a un club privado tienes que ser mayor de 21 años y tener un código de invitación.
Console.Write("Introduce tu nombre: ");
string name = Console.ReadLine();
Console.Write("Introduce tu edad: ");
int age = int.Parse(Console.ReadLine());
if (age >= 21)
{
Console.Write("Introduce el código de invitación: ");
string code = Console.ReadLine();
if (code == "VIP2024")
{
Console.WriteLine("¡Bienvenido, " + name + ", al club VIP!");
}
else
{
Console.WriteLine("Lo siento, código incorrecto. Acceso denegado.");
}
}
else
{
Console.WriteLine("Lo siento, solo puedes entrar si tienes 21 años o más.");
}
Ojo: el if interno comprueba el código solo si la edad ya ha pasado la comprobación. Así ahorras recursos (¡y no pones nervioso al portero!).
2. ¿Cuántos niveles de anidamiento son aceptables?
Técnicamente, los que quieras. Pero en la práctica — cuantos más niveles anidados, más difícil es leer y mantener ese código. Normalmente no se usan más de 2-3 niveles. Si te encuentras con “escaleras” de 4 o más if anidados, piénsalo: igual hay una forma de simplificar la lógica o sacar parte de la comprobación a funciones aparte (¡pero eso es tema para otra lección!).
3. If y else anidados: trampas y matices
Error típico de novato: descuidar las llaves.
Cuando escribes condiciones anidadas, sobre todo usando else, C# sigue las reglas de sintaxis al pie de la letra. Si no pones llaves {}, solo la primera línea después del if o else se asocia a ellos. Esto es una fuente común de bugs molestos.
Ejemplo con posible error:
if (age >= 21)
if (code == "VIP2024")
Console.WriteLine("¡Bienvenido!");
else
Console.WriteLine("Código incorrecto.");
Muchos esperan que el else se refiera a la comprobación de la edad, pero en realidad se refiere al if más cercano (la comprobación del código de invitación). Por eso los mensajes pueden mostrarse de forma inesperada. ¡Mejor usa siempre llaves — incluso si solo hay una línea dentro!
Para que no haya confusiones, te lo muestro otra vez. El compilador interpreta el código de arriba así:
if (age >= 21)
{
if (code == "VIP2024")
Console.WriteLine("¡Bienvenido!");
else
Console.WriteLine("Código incorrecto.");
}
¡Importante! Otra vez:
Si en la construcción if-else no pones llaves, el else se asocia al if anterior (el más cercano).
4. Alternativas: else if en condiciones anidadas
A veces, dentro del if externo quieres no solo comprobar una condición extra, sino también prever una alternativa. Por ejemplo, si el código de invitación no es válido, puedes ofrecer comprar una entrada. Esto se hace con una construcción anidada else if/else:
if (age >= 21)
{
Console.Write("Introduce el código de invitación: ");
string code = Console.ReadLine();
if (code == "VIP2024")
{
Console.WriteLine("¡Bienvenido al club!");
}
else if (code == "GUEST")
{
Console.WriteLine("Modo invitado: acceso solo hasta las 23:00.");
}
else
{
Console.WriteLine("Lo siento, acceso no posible.");
}
}
else
{
Console.WriteLine("Solo puedes entrar si tienes 21 años o más.");
}
En este ejemplo hemos hecho una elección anidada entre tres escenarios: código VIP, código de invitado y rechazo.
5. Práctica: calculadora de descuento con lógica multinivel
Vamos a escribir una app así: al usuario se le aplica un descuento en la tienda según su edad y si tiene tarjeta de club.
- Si la edad del usuario es mayor o igual a 60 — descuento del 15%.
- Si la edad es menor, pero el usuario tiene tarjeta de club — descuento del 7%.
- En los demás casos, no hay descuento.
¿Cómo lo hacemos?
Console.Write("Introduce tu edad: ");
int age = int.Parse(Console.ReadLine());
double discount = 0.0;
if (age >= 60)
{
discount = 0.15;
}
else
{
Console.Write("¿Tienes tarjeta de club (sí/no)? ");
string hasCard = Console.ReadLine();
if (hasCard == "sí")
{
discount = 0.07;
}
}
Console.WriteLine("Tu descuento: " + (discount * 100) + "%");
Aquí hemos usado un if anidado dentro de la rama else. Si la edad no cumple, solo entonces preguntamos por la tarjeta.
GO TO FULL VERSION