Sentencia switch
Ejecuta código según el valor de un argumento integral.
Se utiliza cuando una o varias de las muchas ramas del código necesitan ser ejecutadas de acuerdo a un valor integral.
Sintaxis
switch ( expresión ) sentancia
|
|||||||||
| expresión | - | cualquier expresión de tipo entero (char, entero con o sin signo, o enumeración) |
| sentancia | - | cualquier sentencia (típicamente una sentencia compuesta). Se permiten etiquetas en las sentancias case: y default:. Y la sentencia break; tiene un significado especial.
|
case expresión_constante : sentancia
|
(1) | ||||||||
default : sentancia
|
(2) | ||||||||
| expresión_constante | - | cualquier expresión constante entera |
Explicación
El cuerpo de una sentencia switch puede tener un número arbitrario de etiquetas case: , siempre y cuando los valores de todas las expresiónes_constantes sean únicos (después de la conversión al tipo promovido de expresión). Como máximo una etiqueta default: puede estar presente (aunque las sentencias de los switches anidados pueden usar sus propias etiquetas default: o tener etiquetas case: cuyas constantes son idénticas a las utilizadas en el switch adjunto).
Si la expresión evalúa al valor que es igual al valor de una de las expresiones_constantes después de la conversión al tipo promovido de expresión, entonces el control se transfiere a la sentencia que está etiquetada con esa expresión_constante.
Si la expresión se evalúa a un valor que no coincide con ninguna de las etiquetas case:, y la etiqueta default: está presente, el control se transfiere a la sentencia etiquetada con la etiqueta default:.
Si la expresión se evalúa a un valor que no coincide con ninguna de las etiquetas case:, y la etiqueta default: no está presente, no se ejecutará ninguno de los elementos del switch.
La sentencia break, cuando se encuentra en cualquier parte en la sentancia, sale de la sentencia switch:
switch(1) {
case 1 : puts("1"); // imprime "1",
case 2 : puts("2"); // y luego imprime "2" ("en cascada")
}
switch(1) {
case 1 : puts("1"); // imprime "1"
break; // y sale del switch
case 2 : puts("2");
break;
}
|
Como con todas las demás sentencias de selección e iteración, la sentencia switch establece un alcance del bloque: cualquier identificador introducido en la expresión sale del alcance de aplicación después de la sentancia. Si un VLA u otro identificador de tipo variablemente modificado tiene una etiqueta switch (expr)
{
int i = 4; // no es un VLA; se puede declarar aquí
f(i); // nunca es llamado
// int a[i]; // error: el VLA no puede ser declarado aquí
case 0:
i = 17;
default:;
int a[i]; // se puede declarar VLA aquí
printf("%d\n", i); // imprime 17 si expr == 0, imprime un valor no definido de lo contrario
}
|
(desde C99) |
Términos clave
Ejemplo
#include <stdio.h>
void func(int x)
{
printf("func(%d): ", x);
switch(x)
{
case 1: printf("caso 1, ");
case 2: printf("caso 2, ");
case 3: printf("caso 3.\n"); break;
case 4: printf("caso 4, ");
case 5: printf("caso 5, ");
default: printf("predeterminado.\n");
}
}
int main(void)
{
for(int i = 1; i < 10; ++i) func(i);
}
Salida:
func(1): caso 1, caso 2, caso 3.
func(2): caso 2, caso 3.
func(3): caso 3.
func(4): caso 4, caso 5, predeterminado.
func(5): caso 5, predeterminado.
func(6): predeterminado.
func(7): predeterminado.
func(8): predeterminado.
func(9): predeterminado.
Referencias
- Standard C11 (ISO/IEC 9899:2011):
- 6.8.4.2 The switch statement (p: 149-150)
- Standard C99 (ISO/IEC 9899:1999):
- 6.8.4.2 The switch statement (p: 134-135)
- Standard C89/C90 (ISO/IEC 9899:1990):
- 3.6.4.2 The switch statement
Véase también
Documentación de C++ para Sentencia switch
|