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-specifiersinit-declarator-listOptare;

declaration-specifiers:
storage-class-specifierdeclaration-specifiersOptare
type-specifierdeclaration-specifiersOptare
type-qualifierdeclaration-specifiersOptare

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 rispettino le 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 .staticstorage-class-specifier Le variabili dichiarate da inizializzare static vengono inizializzate all'inizio dell'esecuzione del programma. Se non si inizializza in modo esplicito una variabile globale static , viene inizializzata su 0 per impostazione predefinita e a ogni membro con tipo puntatore viene assegnato un puntatore Null.

  • Le variabili dichiarate con l'identificatore auto della classe di archiviazione vengono register inizializzate ogni volta che il controllo di esecuzione passa al blocco in cui vengono dichiarati. Se si omette un inizializzatore dalla dichiarazione di una auto variabile o register , 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 coinvolge 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 dichiarata esternamente o statica è costante, può essere usato per inizializzare una variabile puntatore dichiarata static internamente. Tuttavia, l'indirizzo di una auto variabile non può essere usato come inizializzatore statico perché può essere diverso per ogni esecuzione del blocco. È possibile usare valori costanti o variabili per inizializzare auto e register 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.

Esempio

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 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 , constla variabile a può essere inizializzata solo e 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 la classe di archiviazione LOCAL e ha solo un indirizzo durante l'esecuzione della funzione in cui viene 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.

Vedi anche

Inizializzazione