Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
En aggregeringstyp är en struktur, union eller matristyp. Om en aggregeringstyp innehåller medlemmar av aggregerade typer tillämpas initieringsreglerna rekursivt.
Syntax
initializer:
{
initializer-list
} /* För aggregerad initiering */
{
initializer-list
, }
initializer-list:
initializer
initializer-list
,
initializer
initializer-list är en lista över initierare avgränsade med kommatecken. Varje initierare i listan är antingen ett konstant uttryck eller en initialiserarlista. Därför kan initieringslistor kapslas. Det här formuläret är användbart för att initiera aggregerade medlemmar av en aggregeringstyp, som du ser i exemplen i det här avsnittet. Men om initiatorn för en automatisk identifierare är ett enda uttryck behöver det inte vara ett konstant uttryck. den behöver bara ha lämplig typ för tilldelning till identifieraren.
För varje initieringslista tilldelas värdena för konstanta uttryck i ordning till motsvarande medlemmar i den aggregerade variabeln.
Om initializer-list har färre värden än en aggregeringstyp initieras de återstående medlemmarna eller elementen av aggregeringstypen till 0. Det initiala värdet för en automatisk identifierare som inte uttryckligen initierats är odefinierat. Om initializer-list har fler värden än en aggregeringstyp resulterar ett fel. Dessa regler gäller för varje inbäddad initieringslista och för aggregeringen som helhet.
En strukturs initialiserare är antingen ett uttryck av samma typ eller en lista över initialiserare för dess medlemmar som omges av klammerparenteser ({ }). Namnlösa bitfältsmedlemmar initieras inte.
När en union initieras initializer-list måste det vara ett enda konstant uttryck. Värdet för det konstanta uttrycket tilldelas till den första medlemmen i unionen.
Om en matris har okänd storlek avgör antalet initialiserare matrisens storlek och dess typ blir fullständig. Det finns inget sätt att ange upprepning av en initialiserare i C, eller att initiera ett element i mitten av en matris utan att ange alla föregående värden också. Om du behöver den här åtgärden i programmet skriver du rutinen i sammansättningsspråket.
Antalet initialiserare kan ange matrisens storlek:
int x[ ] = { 0, 1, 2 }
Om du anger storleken och anger fel antal initialiserare genererar kompilatorn dock ett fel.
Microsoft-specifik
Den maximala storleken för en matris definieras av size_t.
Avsluta Microsoft Specifik
Exempel
I det här exemplet visas initialiserare för en matris.
int P[4][3] =
{
{ 1, 1, 1 },
{ 2, 2, 2 },
{ 3, 3, 3,},
{ 4, 4, 4,},
};
Den här instruktionen deklarerar P som en matris fyra efter tre och initierar elementen i den första raden till 1, elementen i den andra raden till 2 och så vidare, genom den fjärde raden. Initialiserarlistan för den tredje och fjärde raden innehåller kommatecken efter det sista konstanta uttrycket. Den sista initierarlistan ({4, 4, 4,},) följs också av ett kommatecken. Dessa extra kommatecken är tillåtna men krävs inte. Det krävs bara kommatecken som separerar konstanta uttryck från varandra och kommatecken som separerar en initieringslista från en annan.
Om en aggregeringsmedlem inte har någon inbäddad initieringslista tilldelas värden i ordning till varje medlem i underaggregeringen. Därför motsvarar initieringen i föregående exempel följande exempel:
int P[4][3] =
{
1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4
};
Klammerparenteser kan också visas runt enskilda initialiserare i listan och skulle bidra till att förtydliga exemplet.
När du initierar en aggregeringsvariabel måste du vara noga med att använda klammerparenteser och initialiseringslistor korrekt. I följande exempel visas kompilatorns tolkning av klammerparenteser i detalj:
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 */
};
I det här exemplet nlist deklareras som en 2-x-3-matris med strukturer, där varje struktur har tre medlemmar. Rad 1 i initieringen tilldelar värden till den första raden nlisti , enligt följande:
Den första vänstra klammerparentesen på rad 1 signalerar kompilatorn att initieringen av den första aggregerade medlemmen i
nlist(dvsnlist[0]. ) börjar.Den andra vänstra klammerparentesen anger att initieringen av den första aggregerade medlemmen
nlist[0]i (dvs. strukturen pånlist[0][0]) börjar.Den första högra klammerparentesen avslutar initieringen av strukturen
nlist[0][0]. Nästa vänstra klammerparentes startar initieringen avnlist[0][1].Processen fortsätter till slutet av raden, där den avslutande högra klammerparentesen avslutar initieringen av
nlist[0].
Rad 2 tilldelar värden till den andra raden på nlist ett liknande sätt. De yttre uppsättningarna klammerparenteser som omsluter initierarna på rad 1 och 2 krävs. Följande konstruktion, som utelämnar de yttre klammerparenteserna, skulle orsaka ett fel:
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 */
};
I den här konstruktionen startar den första vänstra klammerparentesen på rad 1 initieringen av nlist[0], som är en matris med tre strukturer. Värdena 1, 2 och 3 tilldelas till de tre medlemmarna i den första strukturen. När nästa högra klammerparentes påträffas (efter värdet 3) är initieringen av nlist[0] klar och de två återstående strukturerna i matrisen med tre strukturer initieras automatiskt till 0.
{ 4,5,6 } På samma sätt initierar den första strukturen på den andra raden nlisti . De återstående två strukturerna nlist[1] i är inställda på 0. När kompilatorn stöter på nästa initieringslista ( { 7,8,9 } ) försöker den initiera nlist[2]. Eftersom nlist det bara finns två rader orsakar det här försöket ett fel.
I nästa exempel initieras de tre int medlemmarna x i till 1, 2 respektive 3.
struct list
{
int i, j, k;
float m[2][3];
} x = {
1,
2,
3,
{4.0, 4.0, 4.0}
};
list I strukturen initieras de tre elementen i den första raden m i till 4.0. Elementen i den återstående raden m i initieras som standard till 0,0.
union
{
char x[2][3];
int i, j, k;
} y = { {
{'1'},
{'4'}
}
};
Unionsvariabeln y, i det här exemplet, initieras. Det första elementet i unionen är en matris, så initieraren är en aggregerad initialiserare. Initialiserarlistan {'1'} tilldelar värden till den första raden i matrisen. Eftersom endast ett värde visas i listan initieras elementet i den första kolumnen till tecknet 1och de återstående två elementen på raden initieras till värdet 0 som standard. På samma sätt initieras det första elementet i den andra raden i x till tecknet 4, och de återstående två elementen i raden initieras till värdet 0.