2012-03-16 21 views
5

Perché questo pezzo di codice viene compilato?Rami condizionali

#include <iostream> 

int foo(int x) 
{ 
    if(x == 10) 
    return x*10; 
} 

int main() 
{ 
int a; 
std::cin>>a; 
std::cout<<foo(a)<<'\n'; 
} 

Il compilatore non mi dovrebbe dare un errore come "non tutti i percorsi di codice restituisce un valore"? Cosa succede/restituisce la mia funzione quando x non è uguale a dieci?

+0

Non strettamente correlato, ma può suscitare il tuo interesse: http://stackoverflow.com/questions/9653722/how-does-returning-values-from-a-function-work – Corbin

+0

BTW: che cos'è il compilatore (in modo che Posso evitarlo in futuro)? –

+1

@NicolBolas: non evitare il compilatore, evita la compilazione senza warn-flags! – bitmask

risposta

10

Il risultato non è definito, quindi il compilatore è libero di scegliere: probabilmente si ottiene ciò che accade per sedersi all'indirizzo di stack appropriato in cui il chiamante si aspetta il risultato. Attiva gli avvisi del compilatore e il compilatore ti informerà della tua omissione.

+0

Chiamare una funzione che dovrebbe restituire qualcosa ma non lo fa, può causare un bel crash su alcuni sistemi. – karlphillip

+1

@karlphillip: Sì, perché il compilatore è legalmente autorizzato a bruciare la casa o far volare via il dragone dal naso. Ecco perché ho aggiunto la parola * probabilmente * :) – bitmask

+0

Ho notato :) Ho aggiunto un commento solo per sottolineare quanto può essere male questa pratica. Bella risposta, a proposito. – karlphillip

3

Il compilatore non è richiesto per darti un errore in questa circostanza. Molti lo faranno, alcuni emetteranno solo avvertimenti. Alcuni apparentemente non se ne accorgeranno.

Questo perché è possibile che il codice garantisce al di fuori di questa funzione che la condizione sarà sempre true. Pertanto, non è necessariamente (sebbene lo sia quasi sempre, motivo per cui la maggior parte dei compilatori invierà almeno un avviso).

La specifica indica che il risultato dell'uscita da una funzione che dovrebbe restituire un valore ma non è un comportamento indefinito. Un valore può essere restituito. O il programma potrebbe bloccarsi. O qualsiasi cosa potrebbe accadere. È indefinito.