2012-06-19 10 views

Respuesta

8

La inicialización de variables dentro de sentencias de switch es una mala práctica y un comportamiento indefinido.

+0

Pero la variable b se declara como 20, el compilador sabe cuánto espacio tomará la variable b y qué almacenar allí. ¿Por qué el comportamiento no está definido entonces? – Anon

+0

@Anon: no es parte de una etiqueta. –

+0

lo tengo, gracias. – Anon

5

Si aumenta sus advertencias del compilador verá:

warning: ‘b’ may be used uninitialized in this function 

Eso no es un punto válido para inicializar b, y por lo tanto contiene datos no inicializados en el momento de la impresión en lugar de 20. Eres causando un comportamiento indefinido

-2

Es un var alcance problema. Si mueve

int b=20; 

Fuera del bloque de interruptores, funcionará.

6

La sentencia switch tiene la siguiente estructura:

switch (expression){ 

    // declarations 

    case constant-expression : 
     ... 
    case constant-expression : 
     ... 
    default : 
     ... 
} 

La sección de declaraciones se utiliza en tiempo de compilación para declarar variables, pero no se utiliza en tiempo de ejecución para inicializar ellos (no hay declaraciones en esa sección se ejecutan, de hecho) No es la diferencia entre declarar e inicializar una variable. Desde b no está inicializado el código tiene el mismo resultado que:

int main(){ 
    int b; 
    printf("b is %d\n", b); 

    return 0; 
} 

que está claramente definido. Al compilar con la bandera -Wall se detectará que está utilizando un valor no inicializado.

0

La declaración switch hace un goto a la declaración correspondiente case según el valor de la variable switch y nada más. En este momento está pasando por alto la inicialización de b, por lo que imprimirá lo que haya en la memoria en ese momento en esa ubicación.

Cuestiones relacionadas