Sentencias de selección (programación)
|
Sentencias de selección (programación). También llamadas de control de flujo, permiten decidir entre distintos cursos de acción en función de ciertos valores. Existen tres tipos de estas sentencias de selección:
- if...else
- else if
- switch
De no ser por estas sentencias, el flujo de ejecución del programa estaría siempre constreñido a la ejecución de sus sentencias en el orden en que están colocadas en el código fuente.
Sentencia if … else
En su forma abreviada, cuando no existe la cláusula else, esta sentencia permite escoger entre ejecutar o no una sentencia, en función del resultado de una expresión lógica. En su forma ampliada, cuando la cláusula else está presente, permite escoger entre dos opciones alternativas.
Sintaxis
if ( <condición> ) <sentencia1>; [ else <sentencia2>; ]
Descripción
- <condición> debe ser una expresión relacional que devuelve un valor lógico, es decir, un bool, y estar obligatoriamente entre paréntesis. Pueden declararse variables dentro de la <condición>. Por ejemplo, la siguiente es una sintaxis válida:
if (int val = func(arg)) val = z ; else val = y;
El ámbito de la variable val incluye toda la sentencia if, incluyendo, en su caso, el bloque <sentencia2> de else. La cláusula else es opcional, pero no puede haber sentencias entre el if y else.
- <sentencia1>. Es una sentencia o bloque de código que se ejecuta si <condicion> se evalúa como cierto (true != 0).
- <sentencia2> es una sentencia o bloque de código que se ejecuta si existe un else y <condicion> resulta falso (false == 0)
Puesto que el if simplemente chequea el valor resultante de <condicion> (igual o desigual a cero), las dos expresiones siguientes son equivalentes:
if ( expresion ) <sentencia> ; if ( expresion !=0 ) <sentencia> ;
La forma más general es:
if (<condicion>) { } else { }
Sentencia else if
Estas sentencias no representan en realidad nada nuevo, solo una sucesión de if else anidados, aunque de uso muy frecuente.
if ( <expresion1> ) else if ( <expresion2> ) else if ( <expresion3> ) else
En realidad, a la luz de lo expuesto en el apartado anterior, su indentación correcta sería:
if ( <expresion1> ) else if ( <expresion2> ) else if ( <expresion3> ) else
Las expresiones <expresion> son evaluadas correlativamente hasta que se encuentra la primera que devuelve un valor cierto ( != 0 ), en cuyo caso se ejecuta el bloque de código <sentencia> correspondiente y acaba la evaluación. En caso de que ninguna de las <expresion> sea cierta, se ejecuta la <sentencia> correspondiente al else (si existe).
Sentencia switch
Se trata de una sentencia condicional multi-salida en la que las decisiones se toman en función de un valor numérico entero de entre una serie de opciones posibles. Puede existir una cláusula por defecto o bien no adoptarse ninguna acción.
Sintaxis
switch ( <expresion> ) { case <const1> : <sentencia1>; [break;] case <const2> : <sentencia2>; [break;] . . . case <constN> : <sentenciaN>; [break;] [default : <sentenciaD>; ] }
Descripción
La sentencia switch comprueba cuando una expresión <expresion> entre paréntesis (que se traduce en un valor numérico) coincide con alguno de una serie de valores enteros constantes y diferentes (<constX>). En cuyo caso, se ejecuta un bloque de código específico <sentencia>. En caso de estar presente la cláusula opcional default y no existir concordancia con ninguno de los valores anteriores, se ejecuta una sentencia por defecto (<sentenciaD>). Los valores case y default pueden aparecer en cualquier orden, aunque lo usual es colocar default al final. Los dos puntos : después de <constX> son imprescindibles.
Las expresiones <constX> son expresiones constantes que se resuelven en un entero. Pueden ser simples o compuestas, Ejemplo:
switch (c - 48) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: cout << "Dígito" << endl; break; case 17: case 21: case 25: case 31: case 37: case 49: case 53: case 57: case 63: case 69: cout << "Vocal" << endl; break; default: cout << "Otro carácter" << endl; }
Después de ejecutado el bloque de código correspondiente a una concordancia, siguen las comprobaciones, por lo que puede ser conveniente incluir un break para abandonar el control del switch (no es necesario ningún break después de la última)