Nessun tipo definito di parametro di funzione predefinito per int? Sono pazzo?

Per qualche strana ragione stavo copiando un esempio in un’altra lingua di cui non si usano i tipi, e ho dimenticato di aggiungerne uno in un parametro di definizione di funzione, e ha funzionato.

#include  char toChar(n) { //sizeof n is 4 on my 32 bit system const char *alpha = "0123456789ABCDEF"; return alpha[n]; } int main() { putchar(toChar(15)); //ie return 0; } 

Sono sicuro che le impostazioni predefinite principali int della maggior parte dei compilatori di alcuni standard (ma solo di ritorno), è anche questo un comportamento vero per altre funzioni o è questa implementazione definita? Sembra appena fuori dall’ordinario, il mio compilatore è solo un po ‘obsoleto porta GCC (MinGW).

Dichiarazione di funzioni in stile K & R:

 void foo(n) int n; { } 

Se type non è specificato, il valore predefinito è int. Questo è valido in C89, non C99

@ La risposta di Erik è corretta, ma (IMO) potrebbe essere frainteso piuttosto facilmente.

Quello che hai è una definizione di stile K & R, è assolutamente vero. Dato che int è considerato il tipo predefinito, se hai qualcosa del tipo: foo(n) { } , significa che il tipo di ritorno e il tipo di n sono entrambi int di default.

C99 (principalmente) rimuove la regola “default int”, ma non rimuove completamente le definizioni di stile K & R. Ciò significa che la definizione di cui sopra non è più consentita; per definire foo con gli stessi tipi di quelli precedenti, potresti comunque usare:

 int foo(n) int n; { } 

Vale a dire, la definizione di stile K & R è ancora consentita, ma è necessario specificare il tipo di ritorno e il tipo di parametro, anche se il tipo è int.

Questo stile di definizione della funzione è, tuttavia, obsoleto (per §6.11.7). In realtà è ancora solo permesso per il vecchio codice (pre-standard). Non vuoi scrivere un nuovo codice in questo modo, anche se tecnicamente è ancora consentito. Per il nuovo codice, si desidera chiaramente utilizzare una definizione in stile prototipo:

 int foo(int n) {} 

Per coloro che hanno a cuore queste cose, la definizione di stile K & R è ancora usata in qualche nuovo codice. Il suo stile terser può essere utile (usando il termine liberamente) nel codice-golf.

Finché ci siamo arrivati: la risposta di @ stijn è anche corretta. In particolare quando una funzione è definita in questo modo (vale a dire, stile K & R), tutti gli argomenti sono soggetti a promozioni predefinite. Ciò significa che se passi un intero di tipo più piccolo di int , verrà promosso a int prima di essere passato, e se passi un float , verrà promosso a double .

questo è chiamato argomento promozione. non ricordo le regole esatte, ma si discende dal fatto che al compilatore sia permesso usare int per gli argomenti quando lui (lei?) non conosce ancora il prototipo di funzione.