Abby's Digital Cafe

[C++] condicional simple, doble, compuesta y sentencia switch

por SoySalwa

¿Qué es una condicional?

Una condicional es una estructura de control que permite al programa tomar decisiones. Evalúa una condición que puede resultar en verdadero (true) o falso (false). Dependiendo del resultado, el programa ejecuta un bloque de código u otro. Estas se dividen en:

Condicional Simple (if)

Esta condición solo se ejecuta si la evaluación es verdadera; en caso de que no lo sea, el programa ignora el bloque y continúa su flujo sin hacer nada.

[cpp]
#include <print> int main() { // Declaración de variable n int n = 5; // Condicional simple: pregunta si n es menor que 10 if (n < 10) { std::print("El número {} es menor que 10\n", n); } return 0; }

En este ejemplo, la condición es verdadera porque 5 es menor que 10. En caso de que la condición fuese falsa, el programa terminaría sin mostrar ningún mensaje en la terminal. Para lograr que el programa responda cuando la primera condición no se cumple, utilizamos condicionales dobles:

Condicional Doble (if-else)

Esta estructura nos da dos caminos exclusivos: si la condición del 'if' no se cumple, el flujo salta inmediatamente a ejecutar el bloque del 'else':

[cpp]
#include <print> int main() { // Declaración de variable n int n = 15; // Pregunta si n es menor que 10 if (n < 10) { std::print("El número {} es menor que 10\n", n); } else { std::print("El número {} es mayor o igual que 10\n", n); } return 0; }

En este programa, la ejecución saltará directamente al 'else' debido a que 15 no es menor que 10. Las condicionales dobles garantizan que el flujo siempre devuelva una respuesta controlada, evitando que el programa termine en silencio. Por otro lado, existen escenarios donde necesitaremos evaluar múltiples condiciones consecutivas. Para ello hacemos uso de las condicionales compuestas, donde cada nueva rama se evalúa solo si las anteriores resultaron falsas:

Condicional Compuesta (if-else-if-else)

Este tipo de condición nos permite evaluar múltiples opciones en secuencia, ejecutando el primer bloque cuya condición resulte verdadera:

[cpp]
#include <print> int main() { int n = 15; // Evalúa si el número está dentro de un rango específico usando el operador lógico AND (&&) if (n >= 10 && n <= 20) { std::print("El número {} está en el rango de 10 a 20.\n", n); } else if (n < 10 || n > 20) { // Evalúa una alternativa usando el operador lógico OR (||) std::print("El número {} está fuera del rango permitido.\n", n); } return 0; }

En este programa se hace uso de operadores lógicos para evaluar varias condiciones a la vez. Aquí la primera condición es verdadera porque 15 es mayor o igual que 10 Y TAMBIÉN es menor o igual que 20. Sin embargo, cuando la cantidad de opciones a evaluar es demasiado grande, encadenar decenas de 'else if' arruina la legibilidad y elegancia del código. Es en este escenario donde la sentencia switch se convierte en la mejor opción:

Sentencia Switch

La sentencia switch es una estructura de control condicional de selección múltiple. Permite ramificar la ejecución del programa evaluando una única expresión y comparando su resultado directo con diferentes casos constantes ('case'). Ofrece una alternativa mucho más limpia y organizada que, además, suele ser optimizada por el compilador mediante tablas de salto (jump tables) en memoria.

[cpp]
#include <print> int main() { int n = 2; // El switch evalúa el valor de n switch (n) { case 1: std::print("El número es uno.\n"); break; // Sale del switch inmediatamente case 2: std::print("El número es dos.\n"); break; case 3: std::print("El número es tres.\n"); break; default: std::print("Número no reconocido.\n"); break; // Caso opcional por si no coincide ninguno } return 0; }

Es fundamental recordar el uso de la palabra clave break al final de cada caso. Si se omite, el compilador ejecutará el código del caso coincidente y continuará arrastrándose hacia los siguientes casos de forma consecutiva (efecto fallthrough), ignorando si el valor coincide o no.

Operador ternario

¿Qué es el operador ternario y cómo se estructura?

El operador ternario (? :) es una estructura condicional que funciona como una versión ultra compacta de un if-else. Su propósito principal es evaluar una condición y devolver un valor de manera inmediata en una sola línea de código. Se le llama 'ternario' porque es el único operador en C++ que requiere tres operandos para trabajar.

La sintaxis lógica que sigue el compilador es la siguiente: Condición ? Expresión_Verdadera : Expresión_Falsa;

  • La Condición: Una expresión booleana que se evalúa como verdadera (true) o falsa (false).
  • El signo de interrogación (?): Actúa como el detonante que divide la condición del resultado verdadero.
  • Expresión Verdadera: El valor o acción que se procesa si la condición resultó ser true.
  • Los dos puntos (:): Actúa como el separador equivalente al 'else' (de lo contrario).
  • Expresión Falsa: El valor o acción que se procesa si la condición resultó ser false.
[cpp]
#include <print> #include <string_view> int main() { int nota = 85; // El operador ternario evalúa la condición e inicializa la variable en una sola línea std::string_view estado = (nota >= 60) ? "Aprobado" : "Reprobado"; std::print("El alumno está: {}\n", estado); return 0; }

En el C++ moderno, el operador ternario es tratado como una expresión completa, lo que obliga a que tanto la parte verdadera como la falsa devuelvan tipos de datos idénticos o directamente compatibles. Si intentas devolver tipos incompatibles (como un entero de un lado y una cadena de texto del otro), el compilador fallará inmediatamente al no poder deducir un tipo único en tiempo de compilación.

Preguntas Frecuentes

¿Cómo sabe el compilador de C++ cuál camino tomar exactamente?

En tiempo de compilación, el compilador traduce las condiciones lógicas en instrucciones de salto condicional a nivel de procesador (como JE o JNE en ensamblador). El procesador evalúa los registros de banderas generados por la operación matemática de la condición y salta directamente a la dirección de memoria del bloque de código correspondiente, optimizando el flujo para no leer las instrucciones que no se cumplen.

¿El orden en el que coloco las condiciones en un 'if' compuesto afecta el rendimiento?

Sí, totalmente. Debido a que las condicionales compuestas se evalúan en estricto orden de arriba hacia abajo, una de las mejores prácticas es colocar siempre la condición que tenga mayor probabilidad de ser verdadera al principio. De este modo, el programa resolverá la estructura rápido y evitará evaluar de forma innecesaria las demás condiciones inferiores.

¿Por qué C++ no permite evaluar textos directamente dentro de un switch?

La razón es arquitectónica y de diseño del lenguaje. En C++, un switch solo acepta expresiones constantes de tipo integral (integral constant expression), como números enteros, caracteres o enumeraciones. El compilador utiliza estos valores para generar estructuras optimizadas como tablas de salto (jump tables), permitiendo ejecutar decisiones de forma extremadamente rápida.

Cuando escribes un texto entre comillas dobles como "Hola", C++ lo interpreta como una cadena de caracteres almacenada en memoria (const char[]), que normalmente se convierte en un puntero (const char*). Esto significa que el valor no es un entero simple que el switch pueda usar directamente.

  • Las cadenas tienen tamaño variable: "Hola" ocupa menos memoria que "Bienvenido". El switch está diseñado para trabajar con valores discretos y simples, no con estructuras de longitud variable.
  • Comparar textos requiere revisar caracteres: Para verificar si dos cadenas son iguales, el programa debe comparar carácter por carácter ('H' == 'H', 'o' == 'o', etc.). Esto es más costoso que comparar un único número entero.
  • Los literales de texto no son valores integrales: "Hola" no es un número; es una referencia a memoria. El switch no compara contenido textual, sino valores enteros constantes.

Comentarios