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 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

[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) {
    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 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í
  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)


[editar] Términos clave

switch, case, default

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

[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