2012-02-23 21 views
14

Cómo son las declaraciones que vienen antes de cualquier declaración etiquetada case en un bloque switch-case tratada. favor explicar el comportamiento de los siguientes programas¿Cómo funciona la instrucción switch?

prog1:

#include<stdio.h> 
int main() 
{ 
    switch(1) 
    { 
    int i=0; 
    case 1:printf("%d",i);   
    } 
getchar(); 
return 0; 
} 

de salida: Valor de basura.

prog2:

#include<stdio.h> 
int main() 
{ 
    switch(1) 
    { 
    printf("Inside Switch"); 
    case 1:printf("Case 1\n");  
    } 
    printf("Outside Switch"); 
    getchar(); 
    return 0; 
} 

Salida:

Caso 1

interruptor exterior.

Las declaraciones antes de una declaración etiquetada de caso parecen inalcanzables de acuerdo con el programa 2 pero entonces ¿por qué no obtengo un error para una variable no declarada i en el primer programa (solo una advertencia).

Sería realmente útil si alguien pudiera explicar en detalle cómo se trata internamente la declaración switch.

+1

¿Es esta tarea? Suena como tarea. Si es así, agregue la etiqueta 'homework' y muestre su propio trabajo hasta el momento. –

+2

@ T.J.Crowder Esto no es tarea. Me encontré con esto mientras tomaba el cuestionario C en dorado y tengo curiosidad por saberlo. – Bazooka

+0

Una instrucción 'switch' es básicamente azúcar sintáctica para una tabla de salto con' goto's. –

Respuesta

6

Esto se explica mejor mediante citas del estándar c. Estoy citando las partes relevantes de la norma que se aplican a su pregunta aquí.

6.8.4.2 La sentencia switch

Para 4:

Una sentencia de control switch causas para saltar a, en, o más allá de la afirmación de que es el cuerpo switch, dependiendo sobre el valor de una expresión controladora, y sobre la presencia de una etiqueta default y los valores de cualquier etiqueta case sobre o en el cuerpo del interruptor ......

Para 2:

Si una declaración switch tiene un asociado case o default etiqueta dentro del alcance de un identificador con un tipo modificado variablemente, toda la declaración del interruptor debe estar dentro de la alcance de ese identificador.154)

nota al pie:

154) Es decir, la declaración, ya sea anterior a la sentencia switch, o se sigue el último case o default etiqueta asociada al switch que es en el bloque que contiene la declaración.

Para 7:
EJEMPLO En el fragmento de programa artificial

switch (expr) 
{ 
    int i = 4; 
    f(i); 
    case 0: 
     i = 17; 
     /* falls through into default code */ 
    default: 
     printf("%d\n", i); 
} 

el objeto cuyo identificador es i existe con la duración de almacenamiento automático (dentro del bloque), pero nunca se inicializa, y por lo tanto, si la expresión de control tiene un valor distinto de cero, , la llamada a la función printf tendrá acceso a un valor indeterminado. Del mismo modo, la llamada a la función f no se puede alcanzar.


Lo anterior se aplica a los dos ejemplos de código en la pregunta.
Example 1, i tiene un valor indeterminado ya que nunca se ha inicializado & por lo tanto, imprime símbolos ilegibles, mientras que en
Example 2, no se alcanza printf llamada porque el control salta a la case etiqueta a juego.

+1

gracias por esto y por otros que ha respondido por mí. Muy apreciado. – Bazooka

+0

+1. También tengo un pequeño informe sobre cómo el compilador los implementa si está interesado, consulte [aquí] (http://lazarenko.me/2013/01/13/switch-statement-machine-code/). –

5

Básicamente, un interruptor actúa como un goto a la etiqueta apropiada - las declaraciones intermedias no se ejecutan. Las definiciones de las variables (que realmente ocurren en el momento de la compilación) ocurren, pero si contienen la inicialización, también se omiten.

+0

Puede proporcionar un ejemplo de código. –

2

Nunca escriba declaraciones en el conmutador que no sean parte de ningún caso o predeterminado porque no se ejecutarán.

NOTA: declaración se puede escribir allí, pero no declaración (int i; es la declaración pero int i = 10; es la declaración de asignación + = instrucción de modo de asignación no se realice allí ..!)

switch(a) 
{ 
printf("This will never print"); // this will never executed 
case 1: 
     printf(" 1"); 
break; 

default : 
break; 
} 

por favor vea esto Why variables can not be declared in a switch statement just after labels?

+1

Gracias por el enlace y la respuesta. – Bazooka

Cuestiones relacionadas