GNU/Linux >> Linux Esercitazione >  >> Linux

Perché una funzione principale senza un'istruzione return restituisce il valore 12?

Rispondo perché tutte le risposte esistenti dicono che si tratta di un comportamento indefinito, il che non è vero, quindi non ho nulla da votare.

In C89 (grazie a pmg per il riferimento a una bozza di norma), 5.1.2.2.3:

Un ritorno dalla chiamata iniziale alla funzione main equivale a chiamare la funzione exit con il valore restituito dalla funzione main come argomento. Se viene raggiunto }che termina la funzione principale, lo stato di terminazione restituito all'ambiente host non è specificato.

In C99, citando da n1256, 5.1.2.2.3:

Se il tipo restituito della funzione principale è un tipo compatibile all'interno di int, un ritorno dalla chiamata iniziale alla funzione principale equivale a chiamare la funzione di uscita con il valore restituito dalla funzione principale come argomento; raggiungendo } 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 il main restituisce la funzione, ma in C89 il valore restituito non è specificato dallo standard. Per il tuo programma di esempio, sulla tua implementazione, il valore restituito sembra essere costantemente 12, presumibilmente per il motivo che dice Ben Voigt. Dato che sei su Linux, probabilmente non è un grande cambiamento compilare il tuo codice come C99 (o comunque, compilarlo usando la modalità C99 quasi conforme di gcc).

Per qualsiasi funzione che restituisce un valore diverso da main , è comportamento indefinito, a meno che il chiamante non utilizza il valore restituito (n1256, 6.9.1/12):

Se viene raggiunto il carattere } che termina una funzione e il chiamante utilizza il valore della chiamata di funzione, il comportamento non è definito.

Non sono sicuro se la chiamata iniziale a main dovrebbe essere menzionato come escluso da questa regola generale. Non è necessario che sia: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.


Come dice swegi, è un comportamento indefinito. Come affermano Steve Jessop et al, è un valore non specificato fino a C89 e specificato in C99 (il comportamento osservato non è conforme a C99)

Ciò che effettivamente accade nella maggior parte degli ambienti è che il valore restituito dall'ultimo printf viene lasciato nel registro utilizzato per i valori restituiti.

Quindi sarà 11 per n ==0, 12 se n è una cifra, 14 per n a due cifre, 16 per n a tre cifre, ecc.


Linux
  1. Perché Find -mtime +1 restituisce solo file più vecchi di 2 giorni?

  2. Come funziona una bomba a forcella?

  3. Che cosa significa Env X=() { :;}; Command' Bash Do e perché non è sicuro?

  4. Perché Unix Time inizia al 1970-01-01?

  5. Ottenere cicli di cpu utilizzando RDTSC:perché il valore di RDTSC aumenta sempre?

Perché `esce &` non funziona?

Come funziona "chmod -R 755".

Cosa restituisce malloc(0)?

Il kernel Linux ha la funzione principale?

funzione di chiamata dichiarata di seguito

Perché slabtop -o restituisce solo le prime 23 righe quando il comando viene reindirizzato?