2012-06-16 8 views
20

In questo programma cdichiarano variabili senza alcun tipo di dati in c

a=8; 
main() 
{ 
    printf("%d", a); 
} 

variabile a è stata dichiarata senza alcun tipo di dati e ancora questo programma viene compilato correttamente e dà l'output desiderato.
uscita ::

8 

vederlo su ideone.
ma, quando ho dichiarato la stessa variabile dentro main, dà errore di compilazione.

main() 
{ 
    a=8; 
    printf("%d", a); 
} 

uscita ::

prog.c:2: warning: return type defaults to ‘int’ 
prog.c: In function ‘main’: 
prog.c:3: error: ‘a’ undeclared (first use in this function) 
prog.c:3: error: (Each undeclared identifier is reported only once 
prog.c:3: error: for each function it appears in.) 
prog.c:4: warning: implicit declaration of function ‘printf’ 
prog.c:4: warning: incompatible implicit declaration of built-in function ‘printf’ 

vedere here.

Come funziona il primo programma, ma il secondo?

risposta

22

Quello che vedete qui è il "Implicit Int Rule" al lavoro. In poche parole la regola dice:

"A variable declared without an explicit type name is assumed to be of type int ."

Nota che questa regola è stata revocata nel C99 standard [Ref 1] .Tuttavia, a seconda del compilatore e le sue impostazioni, il primo esempio potrebbe compilare con un avvertimento, o non riuscirà a compilare (con impostazioni di compilazione rigorose)

Se si compila il primo esempio con impostazioni rigorose che aderiscono allo standard c99, il compilatore indicherà la causa principale.

controllo here.

cc1: warnings being treated as errors
prog.c:1: error: data definition has no type or storage class
prog.c:1: error: type defaults to ‘int’ in declaration of ‘a’
prog.c:3: error: return type defaults to ‘int’
prog.c: In function ‘main’:
prog.c:4: error: implicit declaration of function ‘printf’
prog.c:4: error: incompatible implicit declaration of built-in function ‘printf’

EDIT:

why does the first example work but second does not?

Nota l'enfasi sulle parole "variabile dichiarato" nella regola.

Nel primo esempio, dal momento che l'istruzione è alla portata globale viene trattato come un implicita dichiarazione, e il implicito Int Regola viene applicato ad esso.

In secondo luogo esempio, l'istruzione agisce come un assegnazione e non una dichiarazione. Poiché non vi è alcuna dichiarazione, la regola implicita implicita non si applica qui. In assenza di qualsiasi tipo, il compilatore non può determinare quale sia il tipo di a e quindi segnala l'errore.


[Ref 1]

C99 standard: Premessa
Para 5:

This edition replaces the previous edition, ISO/IEC 9899:1990 , as amended and corrected by ISO/IEC 9899/COR1:1994 , ISO/IEC 9899/COR2:1995 , and ISO/IEC 9899/AMD1:1995 .
Major changes from the previous edition include:
.....
.....
— remove implicit int
.....
.....

+0

Ho cancellato ;-) – sczizzo

+0

Mi sembra che abbia un valore. Per una risposta più completa, tuttavia, potresti spiegare che nel secondo esempio, 'a = 8' è un compito, non una dichiarazione. – sczizzo

+2

@ pmr: Spero che la risposta modificata soddisfi la tua obiezione. –

0

È perché in C, qualsiasi/funzione di variabile è implicitamente int.

Questa è la stessa ragione per cui è possibile utilizzare al posto di registerregister int o unsigned invece di unsigned int, auto invece di auto int, e static invece di static int. Personalmente qualifico sempre le mie variabili in modo esplicito con int, ma se lo fai o no è la tua opzione.

+0

In Shakespearean C. –

0

La variabile ha un tipo di dati (int) anche se non è stato scritto il tipo di dati.

È una cattiva pratica sfruttare questa caratteristica.

Apparentemente il tuo compilatore non consente che ciò accada all'interno di una funzione. Questo ha senso perché se permettesse "a = 8;" in una funzione sarebbe molto difficile catturare alcuni errori tipografici.

0

In C++ 11, c'è la auto parola chiave. Sfortunatamente, C e C++ sono linguaggi fortemente tipizzati, i quali richiedono la definizione di un tipo rigoroso per ciascuna variabile dichiarata. Alcuni compilatori assumono int come default, ma è la loro idea e non dovrebbe essere usato, perché è riconosciuto come come un'abitudine di programmazione sbagliata.

+0

Questa domanda riguarda C piuttosto che C++. C è una lingua con uno standard che può essere utilizzato per rispondere a questa domanda. –

4

a=8; al di fuori della funzione si presenta come uno statment dichiarazione, dove a è lo specificatore dichiarazione e = 8 è l'inizializzazione. C utilizzato per consentire di omettere i tipi negli identificatori di dichiarazione e i valori predefiniti su int in questo caso. (Dal C99, questo non è più consentito.)

Tuttavia, in una funzione, a=8; sembra una dichiarazione espressione (un'espressione di assegnazione) e il simbolo a non è risolto. (Si noti che non si hanno dichiarazioni di espressione al di fuori delle funzioni.)

Se si è tentato di eseguire, ad esempio static a = 8;, il risultato sarebbe di nuovo simile a una dichiarazione e dovrebbe essere compilato in quanto il tipo verrà impostato su int.

Ad ogni modo, non fare affidamento su quello :-) Scrivi chiaramente i tuoi tipi.

+0

@AnttiHaapala Spero davvero che il C99 fosse all'ordine del giorno 18 anni fa. :(Aggiornato la risposta, sembra buono ora? – Kos

+0

Molto meglio ;-) –

0

anche un parametro di funzione può essere scritto come int implicito. esempio:

fun(n){printf("%d",n);} 

Il codice sopra funziona bene, ma una volta che un tipo di dati fissa è incluso nei parametri, come

fun(n,char c){ printf("%d",n);} 

Essa mostra errore: Errore: Previsto ')' prima 'char' |

+0

Questo è un problema separato alla domanda. 'fun (n)' introduce una definizione di funzione in stile K & R –

Problemi correlati