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
ofalse
.
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
.
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
Ricevi gli stessi risultati se attivi l'ottimizzazione del codice? – James
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 –