Inicializace agregační typy
"Souhrnný" typ je struktura, unie nebo typ pole.Pokud agregační typ obsahuje členy agregační typy, inicializace pravidla použijí rekurzivně.
Syntaxe
Inicializátor:
{ seznam inicializátor } / * pro inicializaci agregační * /{ initializer-list , }
Inicializátor seznam:
InicializátorInicializátor seznam , inicializátor
Seznam inicializátor je seznam Inicializátory oddělených čárkami.Každý inicializátor v seznamu je konstantní výraz nebo k seznamu inicializátor.Proto mohou být vnořené seznamy inicializátor.Tento formulář je užitečné pro inicializaci agregační členů agregační typu, viz příklady v této části.Ale pokud inicializátor automatické identifikátoru je jeden výraz, ji nemusí být konstantní výraz; pouze musí mít odpovídající typ přiřazení identifikátoru.
Pro každý seznam inicializátor hodnoty konstantní výrazy jsou přiřazeny, v pořadí, odpovídající agregační proměnné členů.
Pokud seznam inicializátor hodnoty méně než agregační typu, zbývající členy nebo prvky typu agregační jsou inicializovány 0.Počáteční hodnota Automatické identifikátor není explicitně inicializován není definován.Pokud seznam inicializátor má více než agregační typ hodnoty, dojde k chybě.Tato pravidla platí každý vložený inicializátor seznam, jakož i agregační funkci jako celek.
Inicializátor struktury je výraz stejného typu nebo seznam Inicializátory pro své členy uzavřeny ve složených závorkách ({}).Nepojmenované členy bitové pole není inicializován.
Při inicializaci unie seznam inicializátor musí být jeden konstantní výraz.První člen unie je přiřazena hodnota konstantní výraz.
Pokud pole obsahuje neznámý velký počet Inicializátory Určuje velikost pole a jeho typ bude dokončena.Neexistuje způsob určení opakování inicializátor v c nebo inicializovat prvek uprostřed pole bez poskytnutí i všechny předchozí hodnoty.Potřebujete-li tuto operaci v programu psát v jazyce sestavení rutinní.
Poznámka: počet Inicializátory nastavit velikost pole:
int x[ ] = { 0, 1, 2 }
Pokud velikost a poskytnout nesprávný počet Inicializátory však kompilátor vygeneruje chybu.
Konkrétní společnosti Microsoft
Maximální velikost pole je definován size_t.Definované v záhlaví souboru STDDEF.H, size_t je unsigned int s rozsahem 0x00000000 nebo 0x7CFFFFFF.
Konec konkrétní společnosti Microsoft
Příklady
Tento příklad ukazuje Inicializátory pro matici.
int P[4][3] =
{
{ 1, 1, 1 },
{ 2, 2, 2 },
{ 3, 3, 3,},
{ 4, 4, 4,},
};
Toto prohlášení prohlašuje P jako inicializuje prvky jeho první řádek 1 prvky jeho druhý řádek 2 atd. až čtvrtý řádek a čtyři krát tři pole.Všimněte si, že inicializátor seznam pro třetí a čtvrté řádků obsahuje čárky po poslední konstantní výraz.Poslední seznam inicializátor ({4, 4, 4,},) také následovanou čárkou.Tyto nadbytečné čárky jsou povoleny, ale nejsou požadovány; jsou požadovány pouze čárkami, které oddělují konstantní výrazy, a ty, které oddělit od druhého, jeden seznam inicializátor.
Pokud žádný seznam vložený inicializátor agregační člen, hodnoty jsou jednoduše přiřazeny, v pořadí, každého člena subaggregate.Inicializace v předchozím příkladu je tedy ekvivalentní následující:
int P[4][3] =
{
1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4
};
Můžete také zobrazit kolem jednotlivých Inicializátory v seznamu a by pomoci objasnit výše uvedený příklad.
Můžete inicializovat agregační proměnnou, musí být pečlivě ve složených závorkách a správně uvádí inicializátor.Následující příklad ukazuje kompilátoru výklad závorky podrobněji:
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án jako 2-3 pole struktur, každá struktura tři členové.Řádek 1 inicializace přiřadí hodnoty v prvním řádku nlist, takto:
První složená závorka vlevo na řádku 1 kompilátor signály, že inicializace první agregační člen nlist (, nlist[0]) je začátek.
Druhý levá složená závorka označuje, že inicializace první agregační člen nlist[0] (konstrukce, v nlist[0][0]) je začátek.
První pravá složená závorka ukončí inicializaci strukturu nlist[0][0]; Další levá složená závorka spustí inicializace nlist[0][1].
Proces pokračuje až do konce řádku, kde končí pravá složená závorka vpravo inicializace nlist[0].
Řádek 2 druhém řádku přiřadí hodnoty nlist podobným způsobem.Všimněte si, že vnější sady složené závorky kolem Inicializátory na řádcích 1 a 2 jsou.Následující konstrukce, vynechá vnější složených závorek způsobí 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 konstrukce první složená závorka vlevo na řádku 1 spustí inicializace nlist[0], což je matice tři struktur.Tři členové první struktury jsou přiřazeny hodnoty 1, 2 a 3.Při inicializaci došlo k (po hodnotu 3), další pravá složená závorka nlist[0] je dokončeno, a dva zbývající struktur v matice tři struktury jsou automaticky inicializovány 0.Podobně { 4,5,6 } inicializuje první struktury v druhém řádku nlist.Zbývající dvě struktury nlist[1] jsou nastaveny na 0.Když kompilátor nalezne další seznam inicializátor ( { 7,8,9 } ), se pokusí inicializovat nlist[2].Od nlist má pouze dva řádky, tento pokus způsobí chybu.
V následujícím příkladu další tři int členové x jsou 1, 2 a 3, resp. inicializována.
struct list
{
int i, j, k;
float m[2][3];
} x = {
1,
2,
3,
{4.0, 4.0, 4.0}
};
V list struktury výše, tři prvky v prvním řádku m jsou inicializovány 4.0; prvky zbývající řádek m jsou inicializován výchozím 0,0.
union
{
char x[2][3];
int i, j, k;
} y = { {
{'1'},
{'4'}
}
};
Unie proměnné y, v tomto příkladu je inicializován.První prvek unie je pole, tak inicializátor je agregační inicializátor.Seznam inicializátor {'1'} přiřadí hodnoty v prvním řádku matice.Protože v seznamu se zobrazí pouze jednu hodnotu, prvek v prvním sloupci je inicializován znaku 1, a zbývající dva prvky v řádku jsou inicializovány na hodnotu 0 ve výchozím nastavení.Podobně první prvek druhého řádku x je inicializován znaku 4, a zbývající dva prvky v řádku jsou inicializovány na hodnotu 0.