Inicializace typů agregace
Agregační typ je struktura, sjednocení nebo typ pole. Pokud agregační typ obsahuje členy agregačních typů, pravidla inicializace se aplikují rekurzivně.
Syntaxe
initializer
:
{
initializer-list
}
/* Pro agregační inicializaci */
{
initializer-list
, }
initializer-list
:
initializer
initializer-list
,
initializer
Jedná se initializer-list
o seznam inicializátorů oddělených čárkami. Každý inicializátor v seznamu je buď konstantní výraz, nebo seznam inicializátoru. Proto lze seznamy inicializátorů vnořit. Tento formulář je užitečný pro inicializaci agregačních členů agregovaného typu, jak je znázorněno v příkladech v této části. Pokud je však inicializátor automatického identifikátoru jediným výrazem, nemusí se jednat o konstantní výraz; musí mít pouze odpovídající typ pro přiřazení identifikátoru.
Pro každý seznam inicializátorů jsou hodnoty konstantních výrazů přiřazeny odpovídajícím členům agregační proměnné.
Pokud initializer-list
má méně hodnot než agregovaný typ, zbývající členy nebo prvky agregovaného typu se inicializují na hodnotu 0. Počáteční hodnota automatického identifikátoru, který není explicitně inicializován, není definována. Pokud initializer-list
má více hodnot než agregovaný typ, zobrazí se výsledky chyb. Tato pravidla platí pro každý vložený seznam inicializátorů a pro agregaci jako celek.
Inicializátor struktury je buď výraz stejného typu, nebo seznam inicializátorů pro jeho členy uzavřené do složených závorek ({ }
). Nepojmenované členy bitových polí nejsou inicializovány.
Při inicializaci initializer-list
sjednocení musí být jedním konstantním výrazem. Hodnota konstantního výrazu je přiřazena prvnímu členu sjednocení.
Pokud má pole neznámou velikost, počet inicializátorů určuje velikost pole a jeho typ se dokončí. Neexistuje způsob, jak zadat opakování inicializátoru v jazyce C nebo inicializovat prvek uprostřed pole bez poskytnutí všech předchozích hodnot. Pokud tuto operaci potřebujete ve svém programu, napište rutinu v jazyce sestavení.
Počet inicializátorů může nastavit velikost pole:
int x[ ] = { 0, 1, 2 }
Pokud zadáte velikost a zadáte nesprávný počet inicializátorů, kompilátor však vygeneruje chybu.
Specifické pro Microsoft
Maximální velikost pole je definována .size_t
END Microsoft Specific
Příklady
Tento příklad ukazuje inicializátory pro pole.
int P[4][3] =
{
{ 1, 1, 1 },
{ 2, 2, 2 },
{ 3, 3, 3,},
{ 4, 4, 4,},
};
Tento příkaz deklaruje jako pole se čtyřmi bajty P
a inicializuje prvky prvního řádku na 1, prvky druhého řádku na 2 a tak dále až do čtvrtého řádku. Seznam inicializátorů pro třetí a čtvrtý řádek obsahuje čárky za posledním konstantním výrazem. Za posledním seznamem inicializátoru ({4, 4, 4,},
) následuje čárka. Tyto nadbytečné čárky jsou povolené, ale nejsou povinné. Vyžadují se pouze čárky, které od sebe oddělují konstantní výrazy a čárky, které oddělují jeden seznam inicializátorů od druhého.
Pokud agregační člen nemá žádný vložený seznam inicializátorů, přiřadí se hodnoty každému členu podaggregy. Inicializace v předchozím příkladu je proto ekvivalentní následujícímu příkladu:
int P[4][3] =
{
1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4
};
Složené závorky se také můžou objevit kolem jednotlivých inicializátorů v seznamu a pomohly by objasnit příklad.
Při inicializaci agregační proměnné musíte být opatrní, abyste správně používali seznamy složených závorek a inicializátorů. Následující příklad znázorňuje podrobněji interpretaci závorek kompilátoru:
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 */
};
V tomto příkladu nlist
je deklarována jako pole struktur 2 by-3, přičemž každá struktura má tři členy. Řádek 1 inicializace přiřadí hodnoty prvnímu nlist
řádku , následujícím způsobem:
První levá složená závorka na řádku 1 signalizuje, že inicializace prvního agregovaného členu
nlist
(tjnlist[0]
. ) začíná.Druhá levá složená závorka označuje, že inicializace prvního agregovaného členu
nlist[0]
(tj. struktury nanlist[0][0]
) začíná.První pravá složená závorka končí inicializaci struktury
nlist[0][0]
; další levá složená závorka začíná inicializacenlist[0][1]
.Proces pokračuje až na konec řádku, kde pravá pravá složená závorka končí inicializace
nlist[0]
.
Řádek 2 přiřadí hodnoty druhému řádku nlist
podobným způsobem. Jsou vyžadovány vnější sady závorek ohraničující inicializátory na řádcích 1 a 2. Následující konstrukce, která vynechá vnější složené závorky, by způsobila chybu:
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 */
};
V této konstrukci začíná první levá složená závorka na řádku 1 inicializace nlist[0]
, což je pole tří struktur. Hodnoty 1, 2 a 3 jsou přiřazeny třem členům první struktury. Když se objeví další pravá složená závorka (po hodnotě 3), inicializace nlist[0]
je dokončená a dvě zbývající struktury v poli se třemi strukturami se automaticky inicializují na hodnotu 0. Podobně inicializuje { 4,5,6 }
první strukturu v druhém řádku .nlist
Zbývající dvě struktury jsou nastaveny nlist[1]
na hodnotu 0. Když kompilátor narazí na další seznam inicializátorů ( { 7,8,9 }
), pokusí se inicializovat nlist[2]
. Vzhledem k tomu nlist
, že tento pokus obsahuje pouze dva řádky, způsobí tento pokus chybu.
V tomto dalším příkladu jsou tři int
členové x
inicializováni na 1, 2 a 3.
struct list
{
int i, j, k;
float m[2][3];
} x = {
1,
2,
3,
{4.0, 4.0, 4.0}
};
Ve struktuře list
jsou tři prvky v prvním řádku m
inicializovány na hodnotu 4.0; prvky zbývajícího m
řádku jsou ve výchozím nastavení inicializovány na hodnotu 0,0.
union
{
char x[2][3];
int i, j, k;
} y = { {
{'1'},
{'4'}
}
};
Inicializuje se proměnná y
sjednocení v tomto příkladu. Prvním prvkem sjednocení je pole, takže inicializátor je agregační inicializátor. Seznam inicializátoru {'1'}
přiřadí hodnoty prvnímu řádku pole. Vzhledem k tomu, že v seznamu se zobrazí pouze jedna hodnota, inicializuje se prvek v prvním sloupci na znak 1
a zbývající dva prvky v řádku se ve výchozím nastavení inicializují na hodnotu 0. Podobně je první prvek druhého řádku x
inicializován na znak 4
a zbývající dva prvky v řádku jsou inicializovány na hodnotu 0.