In C, Quando diciamo che una variabile non è definita? Quando non è presente nel codice completo o nell'ambito di una funzione?
C'è dichiarato, definito e inizializzato; questi termini possono essere applicati a entrambe le funzioni e variabili.
Dichiarato significa che alcune dichiarazioni sono in ambito. Ad esempio, all'interno del codice di qualche funzione, alcuni blocchi possono contenere una dichiarazione di variabile, ad es. %codice%. Senza almeno una dichiarazione, riceverai errori di compilazione. Una dichiarazione è nominalmente un riferimento (forse in avanti) a qualcosa definito altrove.
Definito significa che la definizione autorevole della variabile è presente da qualche parte; ci può essere praticamente una sola definizione, altrimenti è un errore (definizione duplicata). Le dichiarazioni (da sole) non sono sufficienti per fornire una definizione. Una definizione è sufficiente per la dichiarazione (all'interno di quel file). Ad esempio, per quanto riguarda i globals menzionati sopra, questi dovrebbero verificarsi nell'ambito più esterno e senza { extern int a, b (); }
. Per l'ambito globale, le definizioni mancanti (quando sono presenti dichiarazioni) di solito producono errori di collegamento.
Per l'ambito locale ci sono poche dichiarazioni (cioè non ci sono dichiarazioni in avanti come ci sono con scope globali) che non sono anche definizioni, quindi una definizione / dichiarazione mancante comporterebbe un errore in fase di compilazione.
Inizializzato si applica alle variabili e può essere presente o assente alla definizione (non sarebbero consentiti in una semplice dichiarazione). Le variabili locali che al momento dell'uso (cioè leggere) sono determinate per essere non inizializzate sono tipicamente segnalate con errori. Le variabili globali di solito non vengono verificate in questo modo, ma se non viene fornito un inizializzatore generalmente otterrà zeri o null.
In C, When do we say that a variable is undefined? When it is not present in the complete code or in a function scope?
Per un globale, il primo: quando non è presente nel codice completo. Per un locale, potresti dire nell'ambito della funzione.
Se per "c'è" intendi definito, allora sì, sono d'accordo. Tuttavia, un globale può essere dichiarato senza essere definito, e quindi, no, non diremmo che è definito, diremmo che è dichiarato o accessibile.
Generalmente non è necessario essere così precisi nella maggior parte delle circostanze - se vogliamo, possiamo dire definiti o non definiti quando intendiamo veramente dichiarati o non dichiarati. Ma per essere precisi e fedeli alla lingua, possiamo distinguere tra i due.
Questa terminologia appartiene alla lingua. Un'altra lingua può usare termini diversi per gli stessi concetti, o avere concetti diversi per gli stessi termini, e, essi sarebbero incoerenti tra loro, ma queste cose accadono.
È positivo che le specifiche di una lingua siano coerenti con se stessa, ma non esiste una vera ragione per cui due lingue diverse debbano essere o essere coerenti.
Una variabile non è definita quando si tenta di accedervi o assegnarla prima che sia dichiarata.
Questa:
int c;
è una dichiarazione.
Questa:
c = 4;
è un compito.
Se fai c = 4
prima di int c
, ciò causerà un errore "variabile non definita".
Puoi combinare la dichiarazione con l'assegnazione, come in
int c = 4;
ed evitare l'intero problema.