Risposta perché tutte le risposte esistenti dicono che è un comportamento indefinito, che non è vero, quindi non ho nulla circuito integrato un upvote.
In C89 (grazie al PMG per il riferimento a un draft standard), 5.1.2.2.3:
Un ritorno dalla chiamata iniziale alla funzione principale è equivale a chiamare la funzione di uscita con il valore restituito dalla funzione principale come argomento. Se viene raggiunto il} che termina la funzione principale, lo stato di terminazione restituito all'ambiente host è non specificato.
In C99, citazione da n1256, 5.1.2.2.3:
Se il tipo di ritorno della funzione principale è un tipo compatibile con int, un ritorno dalla chiamata iniziale la funzione principale è equivalente alla chiamare la funzione di uscita con il valore restituito da la funzione principale è il suo argomento; arrivando al} che termina la funzione principale restituisce un valore pari a 0. Se il tipo restituito non è compatibile con int, lo stato di terminazione restituito all'ambiente host non è specificato.
Quindi, non è "un comportamento indefinito": si comporta come se le main
funzione ritorna, ma in C89 il valore restituito non è specificato dalla norma. Per il tuo programma di esempio, sulla tua implementazione, il valore restituito sembra essere 12, presumibilmente per il motivo che dice Ben Voigt. Dato che sei su Linux, probabilmente non è una grossa modifica compilare il tuo codice come C99 (o comunque, compilarlo usando la modalità C99 quasi-compatibile di gcc).
Per qualsiasi funzione che restituisce un valore, diverso da main
, si è comportamento indefinito, a meno che il chiamante non utilizza il valore di ritorno (n1256, 6.9.1/12):
Se il} che termina una funzione è raggiunto, e il valore della chiamata della funzione viene utilizzato dal chiamante, il comportamento dello non è definito.
non sono sicuro se la chiamata iniziale main
dovrebbe essere menzionato come escluso da questa regola generale. Non ha bisogno di essere: dal POV dello standard, quella chiamata non ha un chiamante, quindi penso che il valore della chiamata di funzione non sia "usato dal chiamante", anche se diventa lo stato di terminazione per il programma.
+1 buona domanda. :) – Pavitar
http://stackoverflow.com/questions/204476/what-should-main-return-in-c-and-c –