Sdílet prostřednictvím


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:

  1. První levá složená závorka na řádku 1 signalizuje, že inicializace prvního agregovaného členu nlist (tj nlist[0]. ) začíná.

  2. Druhá levá složená závorka označuje, že inicializace prvního agregovaného členu nlist[0] (tj. struktury na nlist[0][0]) začíná.

  3. První pravá složená závorka končí inicializaci struktury nlist[0][0]; další levá složená závorka začíná inicializace nlist[0][1].

  4. 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á ysjednocení 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 1a 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 4a zbývající dva prvky v řádku jsou inicializovány na hodnotu 0.

Viz také

Inicializace