2012-06-19 11 views

risposta

8

L'inizializzazione di variabili all'interno di istruzioni switch è una cattiva pratica e un comportamento non definito.

+0

Ma la variabile b è dichiarata come 20, il compilatore sa quanta variabile di spazio occuperà e cosa memorizzerà lì. Perché allora il comportamento è indefinito? – Anon

+0

@Anon: non fa parte di un'etichetta. –

+0

capito, grazie. – Anon

5

Se si alza vostri avvisi del compilatore si vedrà:

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

Questo non è un posto valido per inizializzare b, e quindi contiene i dati non inizializzate al momento della stampa, invece di 20. Sei causando un comportamento indefinito.

-2

È un problema var ambito. Se si sposta

int b=20; 

Al di fuori del blocco interruttore, funzionerà.

6

L'istruzione switch ha questa struttura:

switch (expression){ 

    // declarations 

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

La sezione delle dichiarazioni viene utilizzato al momento della compilazione per dichiarare le variabili, ma non utilizzati in fase di esecuzione per inizializzare loro (nessun dichiarazioni in quella sezione vengono eseguiti, infatti). Non la differenza tra dichiarare e inizializzare una variabile. Dal momento che non è mai b inizializzata il codice ha lo stesso risultato:

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

    return 0; 
} 

che è chiaramente definito. La compilazione con il flag -Wall rileva che si sta utilizzando un valore non inizializzato.

0

L'istruzione switch fa un goto corrispondente all'istruzione case corrispondente in base al valore della variabile switch e nulla più. In questo momento stai bypassando l'inizializzazione di b, quindi stamperà tutto ciò che era in memoria al momento in quella posizione.

Problemi correlati