Namespaces
Variants

switch statement

From cppreference.net

Ejecuta código de acuerdo con el valor de un argumento integral.

Se utiliza cuando una o varias de muchas ramas de código necesitan ejecutarse según un valor integral.

Contenidos

Sintaxis

attr-spec-seq (opcional) switch ( expression ) statement
attr-spec-seq - (C23) lista opcional de atributos , aplicados a la sentencia switch
expression - cualquier expresión de tipo entero (char, entero con signo o sin signo, o enumeración)
statement - cualquier sentencia (normalmente una sentencia compuesta). case: y default: etiquetas están permitidas en statement , y la sentencia break ; tiene un significado especial.
case constant-expression : statement (1) (hasta C23)
attr-spec-seq (opcional) case constant-expression : statement (opcional) (1) (desde C23)
default : statement (2) (hasta C23)
attr-spec-seq (opcional) default : statement (opcional) (2) (desde C23)
constant-expression - cualquier expresión constante entera constant expression
attr-spec-seq - (C23) lista opcional de attributes , aplicada a la etiqueta

Explicación

El cuerpo de una sentencia switch puede tener un número arbitrario de case: etiquetas, siempre que los valores de todas las constant-expressions sean únicos (después de la conversión al tipo promovido de la expression ). Como máximo puede estar presente una etiqueta default: (aunque las sentencias switch anidadas pueden usar sus propias etiquetas default: o tener etiquetas case: cuyas constantes sean idénticas a las utilizadas en el switch envolvente).

Si expression se evalúa a un valor que es igual al valor de una de las constant-expression s después de la conversión al tipo promovido de expression , entonces el control se transfiere a la sentencia etiquetada con esa constant-expression .

Si expression 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 default: .

Si expression se evalúa a un valor que no coincide con ninguna de las etiquetas case: , y la etiqueta default: no está presente, ninguna parte del cuerpo del switch se ejecuta.

La sentencia break , cuando se encuentra en cualquier parte de statement , sale de la sentencia switch:

switch(1) {
    case 1 : puts("1"); // imprime "1",
    case 2 : puts("2"); // luego imprime "2" ("fall-through")
}
switch(1) {
    case 1 : puts("1"); // imprime "1"
             break;     // y sale del switch
    case 2 : puts("2");
             break;
}

Al igual que todas las demás sentencias de selección e iteración, la sentencia switch establece ámbito de bloque : cualquier identificador introducido en la expresión sale del ámbito después de la sentencia .

Si un VLA u otro identificador con tipo modificable variable tiene una case: o una default: etiqueta dentro de su ámbito, la sentencia switch completa debe estar en su ámbito (en otras palabras, un VLA debe declararse antes de todo el switch o después de la última etiqueta):

switch (expr)
{
        int i = 4; // not a VLA; OK to declare here
        f(i); // never called
//      int a[i]; // error: VLA cannot be declared here
    case 0:
        i = 17;
    default:
        int a[i]; // OK to declare VLA here
        printf("%d\n", i); // prints 17 if expr == 0, prints indeterminate value otherwise
}
(desde C99)

Palabras clave

switch , case , default

Ejemplo

#include <stdio.h>
void func(int x)
{
   printf("func(%d): ", x);
   switch(x)
   {
      case 1: printf("case 1, ");
      case 2: printf("case 2, ");
      case 3: printf("case 3.\n"); break;
      case 4: printf("case 4, ");
      case 5:
      case 6: printf("case 5 or case 6, ");
      default: printf("default.\n");
   }
}
int main(void)
{
   for(int i = 1; i < 9; ++i) func(i);
}

Salida:

func(1): case 1, case 2, case 3.
func(2): case 2, case 3.
func(3): case 3.
func(4): case 4, case 5 or case 6, default.
func(5): case 5 or case 6, default.
func(6): case 5 or case 6, default.
func(7): default.
func(8): default.

Referencias

  • Estándar C17 (ISO/IEC 9899:2018):
  • 6.8.4.2 La sentencia switch (p: 108-109)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 6.8.4.2 La sentencia switch (p: 149-150)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 6.8.4.2 La sentencia switch (p: 134-135)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 3.6.4.2 La sentencia switch

Véase también

Documentación de C++ para switch statement