16

La sezione §3.9.1/6 dal ++ standard C dice,Divertimento con le variabili non inizializzate e compilatore (GCC)

Valori di tipo bool sono o true o false.

Ora consideriamo questo codice,

void f(bool b) 
{ 
    switch(b) //since b is bool, it's value can be either true or false! 
    { 
     case true: cout << "possible value - true"; break; 
     case false: cout << "possible value - false"; break; 
     default: cout << "impossible value"; 
    } 
} 
int main() 
{ 
    bool b; //note : b is uninitialized 
    f(b); 
    return 0; 
} 

Compile F:\workplace>g++ test.cpp -pedantic

Esegui. Uscita:

valore impossibile

uscita imprevisto? Beh, non proprio, come si legge nel standard nella nota del §3.9.1/6 che:

Utilizzando un valore booleano in modi descritti dalla presente norma internazionale come “indefinito”, come ad esempioesaminando il valore di un oggetto automatico non inizializzato , potrebbe comportare il comportamento come se fosse né vero né falso.

Quindi non importa quante volte compilo ed eseguo questo programma, ottengo lo stesso risultato: impossible value. Tuttavia, se cambio un po '- di rimuovere la funzione f() dalla foto, e scrivere il blocco switch in main() sé:

int main() 
{ 
    bool b; //note : b is uninitialized 
    switch(b) //since b is bool, it's value can be either true or false! 
    { 
     case true: cout << "possible value - true"; break; 
     case false: cout << "possible value - false"; break; 
     default: cout << "impossible value"; 
    } 
    return 0; 
} 

Poi ho compilare ed eseguire questo programma, non ho ricevuto impossible value come output; non importa quante volte lo ripeto, non ottengo mai impossible value.

Sono solo curioso di sapere perché questo improvviso cambiamento nel comportamento del bool non inizializzato?

Bene, dal punto di vista linguistico è chiaro: il comportamento non è definito. Lo capisco. Capisco anche che il compilatore è libero di fare qualsiasi cosa. Dal punto di vista del compilatore, tuttavia, mi sembra molto interessante. Che cosa potrebbe fare il compilatore (cioè GCC) in ogni caso e perché?

Sto usando: g++ (GCC) 4.5.0 - MinGW, on Windows 7 Basic, 64-bit OS.

+1

Non riesco a replicare i risultati con g ++ - 4.4.5 amd64. Ma se vuoi rispondere a te stesso questo tipo di domanda, perché non esamini l'output del compilatore? – BatchyX

+1

Ricevi gli stessi risultati se attivi l'ottimizzazione del codice? – James

+1

Quindi la tua domanda è: perché "comportamento indefinito" è diverso quando esposto in diverse situazioni? Per qualcuno che sa che è indefinito non riesco a pensare a domande più ridicole! e può solo vederlo come una domanda progettata per provare e generare punti. -500 –

risposta

17

Sono solo curioso di sapere perché questo improvviso cambiamento nel comportamento del bool non inizializzato?

Disassemblare il codice e vedere cosa fa il compilatore.

La mia ipotesi: dal momento che il valore è ora utilizzato solo localmente, il compilatore lo ottimizza completamente. Poiché il comportamento non è definito comunque, il compilatore può tranquillamente assumere qualsiasi valore, ad es. false.Si tratta di un'ottimizzazione piuttosto ovvia poiché il valore di b è costante per quanto riguarda il compilatore e l'intera logica di switch è ridondante. Quindi, perché metterlo nell'eseguibile?

(Il punto importante qui è proprio che il codice b viene utilizzato sempre localmente nel secondo codice e che a sua volta attiverà ulteriori ottimizzazioni anche in codice non ottimizzato. Il primo codice deve essere inserito prima che il compilatore possa eseguire tali ottimizzazioni, o i percorsi del codice devono essere tracciati che non è banale).

Problemi correlati