Inizializzazione di tipi scalariInitializing Scalar Types

Durante l'inizializzazione dei tipi scalari, il valore di assignment-expression viene assegnato alla variabile.When initializing scalar types, the value of the assignment-expression is assigned to the variable. Vengono applicate le regole di conversione per l'assegnazione.The conversion rules for assignment apply. Per informazioni sulle regole di conversione, vedere Conversione di tipi.(See Type Conversions for information on conversion rules.)

SintassiSyntax

declaration:declaration:
declaration-specifiers init-declarator-list opt;declaration-specifiers init-declarator-list opt;

declaration-specifiers:declaration-specifiers:
storage-class-specifier declaration-specifiers optstorage-class-specifier declaration-specifiers opt

type-specifier declaration-specifiers opttype-specifier declaration-specifiers opt

type-qualifier declaration-specifiers opttype-qualifier declaration-specifiers opt

init-declarator-list:init-declarator-list:
init-declaratorinit-declarator

init-declarator-list , init-declaratorinit-declarator-list , init-declarator

init-declarator:init-declarator:
declaratordeclarator

declarator = initializer /* Per inizializzazione scalare */declarator = initializer /* For scalar initialization */

initializer:initializer:
assignment-expressionassignment-expression

È possibile inizializzare variabili di qualsiasi tipo, a condizione che vengano applicate le regole seguenti:You can initialize variables of any type, provided that you obey the following rules:

  • Le variabili dichiarate a livello di ambito file possono essere inizializzate.Variables declared at the file-scope level can be initialized. Se non si inizializza una variabile in modo esplicito a livello esterno, viene inizializzata su 0 per impostazione predefinita.If you do not explicitly initialize a variable at the external level, it is initialized to 0 by default.

  • Un'espressione costante può essere usata per inizializzare qualsiasi variabile globale dichiarata con static come storage-class-specifier.A constant expression can be used to initialize any global variable declared with the static storage-class-specifier. Le variabili dichiarate come static vengono inizializzate quando inizia l'esecuzione del programma.Variables declared to be static are initialized when program execution begins. Se non si inizializza in modo esplicito una variabile globale static, la variabile viene inizializzata per impostazione predefinita su 0 e a ogni membro con tipo puntatore viene assegnato un puntatore null.If you do not explicitly initialize a global static variable, it is initialized to 0 by default, and every member that has pointer type is assigned a null pointer.

  • Le variabili dichiarate con l'identificatore della classe di archiviazione auto o register vengono inizializzate ogni volta che il controllo dell'esecuzione passa al blocco in cui vengono dichiarate.Variables declared with the auto or register storage-class specifier are initialized each time execution control passes to the block in which they are declared. Se si omette un inizializzatore dalla dichiarazione di una variabile auto o register, il valore iniziale della variabile non è definito.If you omit an initializer from the declaration of an auto or register variable, the initial value of the variable is undefined. Per i valori automatic e register, l'inizializzatore non è necessariamente costituito da una costante; può essere qualsiasi espressione che includa i valori definiti in precedenza, anche le chiamate di funzione.For automatic and register values, the initializer is not restricted to being a constant; it can be any expression involving previously defined values, even function calls.

  • I valori iniziali per le dichiarazioni delle variabili esterne e per tutte le variabili static, sia esterne che interne, devono essere espressioni costanti.The initial values for external variable declarations and for all static variables, whether external or internal, must be constant expressions. 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 static dichiarata internamente.(For more information, see Constant Expressions.) Since the address of any externally declared or static variable is constant, it can be used to initialize an internally declared static pointer variable. Tuttavia l'indirizzo di una variabile auto non può essere usato come inizializzatore statico perché può essere diverso per ogni esecuzione del blocco.However, the address of an auto variable cannot be used as a static initializer because it may be different for each execution of the block. È possibile usare valori delle costanti o delle variabili per inizializzare le variabili auto e register.You can use either constant or variable values to initialize auto and register variables.

  • Se la dichiarazione di un identificatore presenta un ambito del blocco e l'identificatore presenta un collegamento esterno, la dichiarazione non può avere un'inizializzazione.If the declaration of an identifier has block scope, and the identifier has external linkage, the declaration cannot have an initialization.

EsempiExamples

Negli esempi riportati di seguito vengono illustrate le inizializzazioni:The following examples illustrate initializations:

int x = 10;   

La variabile Integer x viene inizializzata nell'espressione costante 10.The integer variable x is initialized to the constant expression 10.

register int *px = 0;  

Il puntatore px viene inizializzato su 0, generando un puntatore "null".The pointer px is initialized to 0, producing a "null" pointer.

const int c = (3 * 1024);  

Questo esempio usa un'espressione costante (3 * 1024) per inizializzare c con un valore costante che non può essere modificato a causa della parola chiave const.This example uses a constant expression (3 * 1024) to initialize c to a constant value that cannot be modified because of the const keyword.

int *b = &x;  

Questa istruzione consente di inizializzare il puntatore b con l'indirizzo di un'altra variabile, x.This statement initializes the pointer b with the address of another variable, x.

int *const a = &z;  

Il puntatore a viene inizializzato con l'indirizzo di una variabile denominata z.The pointer a is initialized with the address of a variable named z. Tuttavia, poiché viene specificata come const, la variabile a può essere solo inizializzata e mai modificata.However, since it is specified to be a const, the variable a can only be initialized, never modified. Punta sempre allo stesso percorso.It always points to the same location.

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.The global variable GLOBAL is declared at the external level, so it has global lifetime. La variabile locale LOCAL ha la classe di archiviazione auto e ha un indirizzo solo durante l'esecuzione della funzione in cui viene dichiarata.The local variable LOCAL has auto storage class and only has an address during the execution of the function in which it is declared. Di conseguenza, il tentativo di inizializzare la variabile puntatore static lp con l'indirizzo di LOCAL non è consentito.Therefore, attempting to initialize the static pointer variable lp with the address of LOCAL is not permitted. La variabile puntatore static gp può essere inizializzata con l'indirizzo di GLOBAL perché tale indirizzo è sempre lo stesso.The static pointer variable gp can be initialized to the address of GLOBAL because that address is always the same. Analogamente, *rp può essere inizializzato in quanto rp è una variabile locale e può disporre di un inizializzatore non costante.Similarly, *rp can be initialized because rp is a local variable and can have a nonconstant initializer. Ogni volta che viene attivato il blocco, LOCAL presenta un nuovo indirizzo, che viene quindi assegnato a rp.Each time the block is entered, LOCAL has a new address, which is then assigned to rp.

Vedere ancheSee Also

InizializzazioneInitialization