Espacios de nombres
Variantes
Acciones

Sentencia switch

De cppreference.com
< c‎ | language

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.

Contenido

[editar]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 sentanciascase: y default:. Y la sentencia break; tiene un significado especial.
caseexpresión_constante:sentancia (1)
default:sentancia (2)
expresión_constante - cualquier expresión constante entera

[editar]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){case1:puts("1");// imprime "1",case2:puts("2");// y luego imprime "2" ("en cascada")}
switch(1){case1:puts("1");// imprime "1"break;// y sale del switchcase2: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 case: o default: dentro de su alcance, toda la declaración de switch debe estar dentro de su alcance (en otras palabras, un VLA debe declararse antes del switch completo o después de la última 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ícase0: 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)


[editar]Términos clave

switch, case, default

[editar]Ejemplo

#include <stdio.h>   void func(int x){printf("func(%d): ", x);switch(x){case1:printf("caso 1, ");case2:printf("caso 2, ");case3:printf("caso 3.\n");break;case4:printf("caso 4, ");case5: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.

[editar]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

[editar]Véase también

Documentación de C++ para Sentencia switch
close