Inizializzazione di tipi scalari
Quando si inizializzano i tipi scalari, il valore di assignment-expression
viene assegnato alla variabile . Vengono applicate le regole di conversione per l'assegnazione. Per informazioni sulle regole di conversione, vedere Conversione di tipi.
Sintassi
declaration
:
declaration-specifiers
init-declarator-list
optare ;
declaration-specifiers
:
storage-class-specifier
declaration-specifiers
optare
type-specifier
declaration-specifiers
optare
type-qualifier
declaration-specifiers
optare
init-declarator-list
:
init-declarator
init-declarator-list
,
init-declarator
init-declarator
:
declarator
declarator
=
initializer
/* Per l'inizializzazione scalare */
initializer
:
assignment-expression
È possibile inizializzare le variabili di qualsiasi tipo, purché si obbedisca alle regole seguenti:
Le variabili dichiarate a livello di ambito file possono essere inizializzate. Se non si inizializza in modo esplicito una variabile a livello esterno, viene inizializzata su 0 per impostazione predefinita.
Un'espressione costante può essere usata per inizializzare qualsiasi variabile globale dichiarata con .
static
storage-class-specifier
Le variabili dichiarate dastatic
inizializzare all'inizio dell'esecuzione del programma. Se non si inizializza in modo esplicito una variabile globalestatic
, viene inizializzata su 0 per impostazione predefinita e a ogni membro con tipo di puntatore viene assegnato un puntatore Null.Le variabili dichiarate con l'identificatore
auto
di classe di archiviazione oregister
vengono inizializzate ogni volta che il controllo di esecuzione passa al blocco in cui vengono dichiarati. Se si omette un inizializzatore dalla dichiarazione di unaauto
variabile oregister
, il valore iniziale della variabile non è definito. Per i valori automatici e registrati, l'inizializzatore non è limitato a essere una costante; può essere qualsiasi espressione che include valori definiti in precedenza, anche chiamate di funzione.I valori iniziali per le dichiarazioni di variabili esterne e per tutte le
static
variabili, sia esterne che interne, devono essere espressioni costanti. Per altre informazioni, vedere Espressioni costanti. Poiché l'indirizzo di qualsiasi variabile esternamente dichiarata o statica è costante, può essere usato per inizializzare una variabile puntatore dichiaratastatic
internamente. Tuttavia, l'indirizzo di unaauto
variabile non può essere usato come inizializzatore statico perché può essere diverso per ogni esecuzione del blocco. È possibile usare valori costanti o variabili per inizializzareauto
eregister
variabili.Se la dichiarazione di un identificatore ha un ambito di blocco e l'identificatore ha un collegamento esterno, la dichiarazione non può avere un'inizializzazione.
Esempi
Negli esempi riportati di seguito vengono illustrate le inizializzazioni:
int x = 10;
La variabile Integer x
viene inizializzata nell'espressione costante 10
.
register int *px = 0;
Il puntatore px
viene inizializzato su 0, generando un puntatore "null".
const int c = (3 * 1024);
In questo esempio viene utilizzata un'espressione (3 * 1024)
costante per inizializzare c
in un valore costante che non può essere modificato a causa della const
parola chiave .
int *b = &x;
Questa istruzione consente di inizializzare il puntatore b
con l'indirizzo di un'altra variabile, x
.
int *const a = &z;
Il puntatore a
viene inizializzato con l'indirizzo di una variabile denominata z
. Tuttavia, poiché è specificato come , const
la variabile a
può essere inizializzata solo, mai modificata. Punta sempre allo stesso percorso.
int GLOBAL ;
int function( void )
{
int LOCAL ;
static int *lp = &LOCAL; /* Illegal initialization */
static int *gp = &GLOBAL; /* Legal initialization */
register int *rp = &LOCAL; /* Legal initialization */
}
La variabile globale GLOBAL
viene dichiarata a livello esterno, quindi ha una durata globale. La variabile locale ha auto
una classe di archiviazione LOCAL
e ha solo un indirizzo durante l'esecuzione della funzione in cui è dichiarata. Pertanto, il tentativo di inizializzare la static
variabile del puntatore lp
con l'indirizzo di LOCAL
non è consentito. La static
variabile puntatore gp
può essere inizializzata nell'indirizzo di GLOBAL
perché tale indirizzo è sempre lo stesso. Analogamente, *rp
può essere inizializzato perché rp
è una variabile locale e può avere un inizializzatore non costante. Ogni volta che viene attivato il blocco, LOCAL
presenta un nuovo indirizzo, che viene quindi assegnato a rp
.