2016-05-19 9 views
7

Si consideri il semplice programma C:Perché un tipo di dati è necessario per un'inizializzazione che segue una dichiarazione?

int a;  // declaration 
int a = 11; // initialization 

int main(int argc, char* argv[]) { 
    int b; // declaration 
    b = 10; // assignment 

Se l'inizializzazione di a sono stati scritti senza il tipo di dati, come ad esempio a = 11, il compilatore genera un avviso. Perché l'inizializzazione di a richiede un tipo di dati, quando la dichiarazione di a specifica già il suo tipo di dati?

+2

Beh, non sono sicuro della tua domanda, ma di scrivere un codice fuori dal campo funzionale .... –

+0

Per C++ c'è la parola chiave 'auto', che fondamentalmente fa questo. – arrowd

+3

http://stackoverflow.com/q/3095861/3185968 – EOF

risposta

3

int a allo scope del file è una definizione "provvisoria" (perché manca la parte di inizializzazione). Ciò significa che a può essere nuovamente definito con un valore in un momento successivo.

Un tentativo di definizione può o non può agire come una definizione, a seconda se v'è una definizione esterna reale prima o dopo nella unità di traduzione:

int a = 5; // defines a in the current translation unit with external linkage and a value of 5 
int a; // tentative definition with no effect (a is already defined) 

Viceversa solito ha un valore più pratico :

int a; 
... 
int a = 5; 

la definizione provvisoria potrebbe precedere la definizione stessa, se, per esempio, la costante usata per inizializzare non è disponibile al primo punto.

Edit:

Lei sembra essere confuso, che non si è in grado di eseguire un incarico nell'ambito di file. Un programma C può avere operazioni effettive solo all'interno delle funzioni. Nell'ambito del file, si possono solo definire o dichiarare variabili, tipi e funzioni.

+1

Non vedo come questo risponde "Perché l'inizializzazione di a richiede un tipo di dati, quando la dichiarazione di una specifica già il suo tipo di dati?" – JETM

+0

Non vedo davvero come questo avrebbe alcun valore pratico in ogni situazione. – Lundin

+0

@Lundin: immagina una situazione in cui stai includendo un blocco di codice generato automaticamente alla fine (con l'inizializzazione), ma le funzioni precedenti devono accedere a 'a'. –

-3

come tuo esempio:

int a; // <--- is a declaration 
int a = 11; // <--- is reference to a const value 

è possibile scrivere codice come questo: int a;

int main() { 
    a = 11; // <--- simply no warning. 
    return 0; 
} 

Questo perché a = 1; // < --- è un'istruzione di codice int a = 1; // < --- è un riferimento al valore const

In c, non è possibile assegnare un compito al di fuori dell'ambito della funzione.

+0

Qui si mescolano le cose, non ci sono costanti definite nel codice.Ci sono due semplici modi in C per definire le costanti, usando ** # define ** preprocessore o usando ** const ** keyword. – Babblo

2

Penso che questo abbia qualcosa a che fare con il fatto che non è possibile scrivere istruzioni nell'ambito globale. Che cosa significa:

int a = 11; 

Definisce una variabile. Questo dice al compilatore di assegnare un indirizzo statico alla variabile, perché è globale. Il valore predefinito (assegnazione) è solo un ulteriore vantaggio. considerando quanto segue:

a = 11; 

è un'istruzione, che è illegale.

+0

Ma sto chiedendo perché il compilatore ha bisogno del tipo di dati nelle successive dichiarazioni/inizializzazione, quando ha già visto il tipo di dati della variabile. Non sto chiedendo perché l'assegnazione è illegale al di fuori di un corpo di una funzione. – ybakos

Problemi correlati