Inizializzare i tipi di aggregazione

un tipo “di aggregazione„ è una struttura, un'unione, o un tipo di matrice.Se un tipo di aggregazione contiene i membri dei tipi di aggregazione, le regole di inizializzazione vengono applicate in modo ricorsivo.

Sintassi

  • inizializzatore:
    { elenco di inizializzatori } /* Per l'inizializzazione di aggregazione */

    { elenco di inizializzatori ,}

  • elenco di inizializzatori:
    inizializzatore

    elenco di inizializzatori , inizializzatore

elenco di inizializzatori è un elenco di inizializzatori separati da virgole.Ogni inizializzatore nell'elenco è un'espressione costante o un elenco di inizializzatori.di conseguenza, gli elenchi di inizializzatori possono essere annidati.Questo form è utile per inizializzare i membri di aggregazione di un tipo di aggregazione, come illustrato negli esempi riportati in questa sezione.Tuttavia, se l'inizializzatore di un identificatore automatico è una sola espressione, non deve essere un'espressione costante; solo deve avere il tipo appropriato per l'assegnazione all'identificatore.

Per ogni elenco di inizializzatori, i valori delle espressioni costanti sono assegnati, nell'ordine, ai membri corrispondenti della variabile di aggregazione.

se elenco di inizializzatori ha meno valori che un tipo di aggregazione, i membri rimanenti o gli elementi del tipo di aggregazione vengono inizializzati su 0.Il valore iniziale di un identificatore automatico non esplicitamente inizializzato è definito.se elenco di inizializzatori contiene più valori che un tipo di aggregazione, risultati degli errori.Queste regole vengono applicate a ogni elenco di inizializzatori incorporato nonché all'aggregazione nel suo complesso.

L'inizializzatore di una struttura è un'espressione dello stesso tipo, oppure un elenco di inizializzatori per i membri racchiusi tra parentesi graffe ().I membri senza nome del campo di bit non vengono inizializzati.

Quando quest'ultima viene inizializzata, elenco di inizializzatori deve essere un'espressione costante.Il valore dell'espressione costante viene assegnato al primo membro dell'unione.

Se una matrice di dimensione sconosciuta, il numero di inizializzatori determina la dimensione della matrice e il relativo tipo diventa completo.Non è possibile specificare la ripetizione di un inizializzatore in C#, o inizializzare un elemento al centro di una matrice senza fornire tutti i valori precedenti anche.Se è necessaria questa operazione nel programma, scrivere una routine in linguaggio assembly.

Si noti che il numero di inizializzatori possibile impostare la dimensione della matrice:

int x[ ] = { 0, 1, 2 }

Se si specifica la dimensione e si specifica il numero errato di inizializzatori, tuttavia, il compilatore genera un errore.

Specifici di Microsoft

La dimensione massima di una matrice è definita da size_t.Definito nel file di intestazione STDDEF.H, size_t viene unsigned int con l'intervallo 0x00000000 a 0x7CFFFFFF.

Microsoft FINALE specifico

Esempi

questo esempio mostra gli inizializzatori per una matrice.

int P[4][3] = 
{
    { 1, 1, 1 },
    { 2, 2, 2 },
    { 3, 3, 3,},
    { 4, 4, 4,},
};

Questa istruzione dichiara P ad esempio quattro--tre una matrice e inizializza gli elementi della prima riga su 1, gli elementi della seconda riga su 2 e così via, nella quarta riga.Si noti che nell'elenco di inizializzatori per la terza e quarta riga contiene virgole dopo l'ultima espressione costante.l'ultimo elenco di inizializzatori ({4, 4, 4,},sono inoltre è seguito da una virgola.Questi virgole aggiuntivi sono consentiti ma non sono necessari; solo virgole che separano le espressioni costantialtro e quelli che sia un elenco di inizializzatori separato da un altro, è obbligatorio.

Se un membro di aggregazione non ha elenco di inizializzatori incorporato, i valori vengono assegnati semplicemente, in ordine, a ogni membro del subaggregato.Di conseguenza, l'inizializzazione nell'esempio precedente è equivalente al seguente:

int P[4][3] = 
{
   1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4
};

Le parentesi graffe possono risultare attorno ai singoli inizializzatori nell'elenco e contribuirebbero chiarire l'esempio precedente.

Quando si inizializza una variabile di aggregazione, è necessario prestare attenzione a utilizzare le parentesi graffe e gli elenchi di inizializzatori correttamente.Nell'esempio seguente viene illustrato più dettagliatamente l'interpretazione del compilatore delle parentesi graffe:

typedef struct 
{
    int n1, n2, n3;
} triplet;

triplet nlist[2][3] = 
{
    { {  1, 2, 3 }, {  4, 5, 6 }, {  7, 8, 9 } },  /* Row 1 */
    { { 10,11,12 }, { 13,14,15 }, { 16,17,18 } }   /* Row 2 */
};

in questo esempio, nlist viene dichiarato come 2 3x3 una matrice di strutture, ogni struttura che dispone di tre membri.La riga 1 di inizializzazione assegna valori alla prima riga di nlist, come segue:

  1. Innanzitutto la parentesi graffa aperta sulla riga 1 indica al compilatore che l'inizializzazione del primo membro di aggregazione nlist ovvero nlist[0]) sta iniziando.

  2. La seconda parentesi graffa aperta indica che l'inizializzazione del primo membro di aggregazione nlist[0] ovvero la struttura a nlist[0][0]) sta iniziando.

  3. La prima parentesi graffa destra termina l'inizializzazione della struttura nlist[0][0]; dopo la parentesi graffa aperta inizierà l'inizializzazione di nlist[0][1].

  4. Il processo continua fino alla fine della riga, dove la parentesi graffa destra di chiusura termina l'inizializzazione nlist[0].

La riga 2 assegna valori alla seconda riga di nlist in modo simile.Si noti che imposta esterni di parentesi che racchiudono gli inizializzatori nelle righe 1 e 2 sono necessari.Nell'attributo, che omette le parentesi graffe esterne, genererebbe un errore:

triplet nlist[2][3] =  /* THIS CAUSES AN ERROR */
{
     {  1, 2, 3 },{  4, 5, 6 },{  7, 8, 9 },   /* Line 1 */
     { 10,11,12 },{ 13,14,15 },{ 16,17,18 }    /* Line 2 */
};

In questa costruzione, innanzitutto la parentesi graffa 1 online di sinistra avvia l'inizializzazione di nlist[0], che è una matrice di tre strutture.I valori 1, 2 e 3 sono assegnati i tre membri della prima struttura.Quando la parentesi graffa destra seguente viene rilevata (dopo il valore 3), l'inizializzazione di nlist[0] è completo e le due strutture rimanenti della matrice di tre-struttura automaticamente vengono inizializzate a 0.Analogamente, { 4,5,6 } inizializza la prima struttura nella seconda riga di nlist.le due strutture rimanenti di nlist[1] è impostato su 0.Quando il compilatore rileva elenco di inizializzatori seguente ( { 7,8,9 }), tenta di inizializzare nlist[2].da allora nlist dispone di due righe, questo tentativo un errore.

in questo esempio seguente, i tre int membri di x vengono inizializzati su 1, 2 e 3, rispettivamente.

struct list 
{
    int i, j, k;
    float m[2][3];
} x = {
        1,
        2,
        3,
       {4.0, 4.0, 4.0}
      };

in list struttura precedente, i tre elementi nella prima riga di m vengono inizializzati su 4,0; gli elementi della riga rimanente di m vengono inizializzati su 0,0 per impostazione predefinita.

union
{
    char x[2][3];
    int i, j, k;
} y = { {
            {'1'},
            {'4'} 
        }
      };

La variabile di unione y, in questo esempio, viene inizializzato.Il primo elemento dell'unione è una matrice, pertanto inizializzatore è un inizializzatore di aggregazione.Elenco di inizializzatori {'1'} assegna valori alla prima riga della matrice.Poiché un solo valore viene visualizzato nell'elenco, l'elemento nella prima colonna viene inizializzato con il carattere 1i due elementi rimanenti nella riga vengono inizializzati sul valore 0 per impostazione predefinita.Analogamente, il primo elemento della seconda riga di x viene inizializzato con il carattere 4i due elementi rimanenti nella riga vengono inizializzati sul valore 0.

Vedere anche

Concetti

Inizializzazione