Los condicionales son una herramienta fundamental en la programación estructurada, y en C contamos con dos tipos principales: el if (junto con else y else if) y el switch. Estos nos permiten controlar el flujo de ejecución de nuestro programa en función de ciertas condiciones, haciendo que se ejecuten diferentes bloques de código según los valores que manejemos.
Empezamos con el if, que es una instrucción que evalúa una condición y ejecuta un bloque de código solo si esa condición es verdadera. Por ejemplo, si tenemos una variable x con un valor determinado, podemos decidir que si x es igual a 20, se ejecute un código específico. La sintaxis básica es escribir if seguido de la condición entre paréntesis, y luego el bloque de instrucciones entre llaves. Si la condición no se cumple, podemos usar else para ejecutar otro bloque alternativo. Esto nos permite crear regiones de código mutuamente excluyentes, donde solo se ejecuta uno u otro bloque según el valor de la variable.
Las condiciones dentro del if se expresan usando operadores lógicos como == para igualdad, >, <, >=, <= para comparaciones, y también podemos combinar varias condiciones con operadores booleanos. Por ejemplo, el operador && (and lógico) nos permite exigir que dos condiciones sean verdaderas simultáneamente, como que x sea mayor que 20 y menor que 30. Por otro lado, el operador || (or lógico) hace que la condición sea verdadera si al menos una de las subcondiciones lo es. Además, podemos agrupar condiciones con paréntesis para controlar el orden de evaluación y construir expresiones complejas.
Veamos un ejemplo sencillo que ilustra el uso de if y else:
int x = 20;
if (x == 20) {
printf("x vale 20\n");
} else {
printf("x no vale 20\n");
}
printf("Esto se ejecuta siempre\n");
Aquí, si x es 20, se imprime x vale 20, y si no, x no vale 20. La última línea se ejecuta siempre, independientemente del valor de x. Notemos que para imprimir un salto de línea usamos \n dentro del printf.
Cuando queremos evaluar múltiples condiciones, podemos anidar if dentro de else, pero esto puede volverse poco legible y engorroso. Por suerte, C nos ofrece la instrucción else if, que nos permite encadenar varias condiciones de forma más clara y ordenada. Por ejemplo:
if (x == 20) {
printf("x vale 20\n");
} else if (x == 30) {
printf("x vale 30\n");
} else if (x == 40) {
printf("x vale 40\n");
} else {
printf("no sé lo que vale x\n");
}
Este código evalúa varias posibilidades para x y ejecuta el bloque correspondiente. Si ninguna condición se cumple, se ejecuta el bloque del else final.
Sin embargo, cuando tenemos muchas condiciones que dependen del valor exacto de una variable, como en el caso de identificar días de la semana según un número, usar múltiples else if puede ser poco práctico. Aquí es donde el switch resulta muy útil. El switch evalúa una expresión una sola vez y compara su valor con diferentes casos (case). Cada case especifica un valor y el código que se ejecuta si la variable coincide con ese valor. Además, podemos usar default para manejar cualquier valor que no coincida con los casos definidos.
La estructura básica de un switch es:
switch (numeroDeDia) {
case 1:
printf("lunes\n");
break;
case 2:
printf("martes\n");
break;
case 3:
printf("miércoles\n");
break;
// ... otros casos ...
default:
printf("no es un día de la semana válido\n");
break;
}
Es fundamental incluir la instrucción break al final de cada caso para evitar que la ejecución continúe en los casos siguientes, un comportamiento conocido como fall through. Si omitimos el break, el programa ejecutará todos los bloques de código que siguen al caso coincidente, lo que generalmente no es deseado.
Aunque en algunos lenguajes modernos el switch termina automáticamente después de cada caso, en C debemos controlar esto explícitamente con break. Sin embargo, en ciertas situaciones podemos aprovechar esta característica para agrupar casos que deben ejecutar el mismo código. Por ejemplo, para determinar si un día es laborable o fin de semana, podemos escribir:
switch (numeroDeDia) {
case 1:
case 2:
case 3:
case 4:
case 5:
printf("laborable\n");
break;
case 6:
case 7:
printf("fin de semana\n");
break;
default:
printf("día no válido\n");
break;
}
Aquí, los casos del 1 al 5 comparten el mismo bloque de código, y los casos 6 y 7 otro, gracias a la ausencia de break entre ellos.
En definitiva, el uso adecuado de if, else if, else y switch nos permite controlar el flujo de nuestros programas de manera clara y eficiente, adaptándonos a la complejidad de las condiciones que necesitemos evaluar. Como ejercicio, podemos practicar creando una función que, dado un número, nos diga a qué mes del año corresponde, usando cualquiera de estas estructuras condicionales.