Las declaraciones de cambio de caso son un sustituto de las declaraciones if largas que comparan una variable con varios valores integrales. La declaración de cambio es una declaración de bifurcación de múltiples vías. Proporciona una forma sencilla de enviar la ejecución a diferentes partes del código en función del valor de la expresión. Es una declaración de control que permite que un valor cambie el control de ejecución.
Sintaxis:
C++
// Syntax for Switch Case switch (n) { // code to be executed if n = 1 case 1: break; // code to be executed if n = 2 case 2: break; // code to be executed if n // doesn't match any cases default: }
Puntos clave:
- Switch toma un argumento de entrada y selecciona un caso.
- La expresión utilizada en el caso debe ser un tipo constante.
- La sentencia fuera de todo caso NO se ejecutará.
Este artículo se centra en la tercera sentencia ‘La sentencia fuera de todo caso NO se ejecutará’.
Ejemplo 1: Prediga la salida del siguiente programa:
C
// C program to illustrate the switch statement #include <stdio.h> // Driver Code int main() { switch (1) { int test = 10; printf("dead code\n"); case 1: printf("%d\n", test); } return 0; }
0
Explicación: el valor de basura se obtiene como salida aunque se supone que el valor de la prueba es 10. Se puede ver claramente que se ignora la declaración de impresión antes del caso 1 (tal vez se elimine durante la optimización del código como parte de la eliminación del código inactivo ), por lo que se puede concluir que la sentencia anterior tampoco se ejecuta. Significa que la variable test no está declarada. ¿es verdad? vamos a ver.
Analizador y tabla de símbolos: el análisis léxico es la primera fase del compilador, también conocido como escáner o analizador. Convierte el programa de entrada de alto nivel en una secuencia de tokens. Estos tokens pueden ser de diferentes tipos. La tabla de símbolos es una estructura de datos creada y mantenida por el compilador. Almacena información sobre el alcance e información vinculante sobre nombres, información sobre instancias de varias entidades, como nombres de variables y funciones, clases, objetos, etc.
Hay muchas columnas en la tabla de símbolos, pero para simplificar, tomemos los campos ‘nombre de variable’ y ‘dirección’.
Ejemplo 1: int x = 5;
Analizador léxico:
int – palabra clave
x – identificador
= – operador
5 – constante
; – símbolo especialTabla de símbolos:
———————————————-
| nombre de la variable | dirección |
———————————————-
| x | 0 |
———————————————-
Ejemplo 2:
vacío principal (int a)
{
int b = a;
}Analizador léxico:
void- palabra clave
principal – identificador
() – símbolo especial
{} – símbolo especial
int – palabra clave
a – identificador
b – identificador
= – operador
; – símbolo especialTabla de símbolos-
———————————————-
| nombre de la variable | dirección |
———————————————-
| principal | 0 |
———————————————-
| un | 4 |
———————————————-
| segundo | 8 |
———————————————-
Si las declaraciones fuera de Case no se ejecutan, ¿cómo es posible usar la variable ‘prueba’ sin declararla? Veamos cómo esta línea pasa por alto la fase de análisis de la compilación.
Analizador léxico : Lexer analizará todo el programa normalmente. Esta es la fase en la que se crea la tabla de símbolos, la variable de prueba se reconoce como un token y se agrega a la tabla de símbolos.
———————————————-
| nombre de la variable | dirección |
———————————————-
| prueba | 0 |
———————————————-
Analizador de sintaxis : analiza la sintaxis de todo el programa. Estructuralmente nuestro programa está perfectamente bien. Ningún error hasta ahora.
Analizador semántico : intentará asignar significado al árbol de análisis. La prueba variablese asigna como un tipo de número entero y ha superado con éxito todas las fases de análisis.
——————————————————————
| nombre de la variable | dirección | tipo |
——————————————————————
| prueba | 0 | entero |
——————————————————————
Ahora la prueba de identificador ha ocupado con éxito un lugar en la tabla de símbolos. La tabla de símbolos se rellena con valores en tiempo de ejecución, pero debido a que en tiempo de ejecución las líneas 5 y 6 no se ejecutan, el valor de la variable test no se actualiza. Por lo tanto, obtenemos algún valor de basura como salida.
Publicación traducida automáticamente
Artículo escrito por prathviraj_b y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA