switch statement
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:
|
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
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
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
|