匯總類型是結構、等位或數位型別。 如果匯總類型包含匯總類型的成員,初始化規則會以遞歸方式套用。
語法
initializer:
{
initializer-list
} /* 用於匯總初始化 */
{
initializer-list
, }
initializer-list:
initializer
initializer-list
,
initializer
initializer-list是以逗號分隔的初始化表達式清單。 清單中的每個初始化運算式都是常數表達式或初始化表達式清單。 因此,初始化表達式清單可以巢狀化。 此窗體適用於初始化匯總類型的匯總成員,如本節中的範例所示。 不過,如果自動標識子的初始化表達式是單一表達式,則不需要常數表達式;它只需要有適當的類型,才能指派給標識符。
針對每個初始化表達式清單,常數表達式的值會依序指派給匯總變數的對應成員。
如果 initializer-list 值小於匯總類型,則匯總類型的其餘成員或元素會初始化為 0。 未明確初始化之自動識別碼的初始值未定義。 如果 initializer-list 的值超過匯總類型,則會產生錯誤。 這些規則會套用至每個內嵌初始化表達式清單,以及整體匯總。
結構的初始化表達式是相同類型的表達式,或是以大括弧括住的成員初始化表達式清單。{ }。 未命名的位欄位成員不會初始化。
初始化等位時, initializer-list 必須是單一常數表達式。 常數表達式的值會指派給等位的第一個成員。
如果陣列的大小未知,初始化表達式的數目會決定陣列的大小,而且其類型會變成完成。 在 C 中無法指定初始化表達式的重複,或是在數位中間初始化元素,而不需提供上述所有值。 如果您需要在程式中執行這項作業,請使用元件語言撰寫例程。
初始化表示式的數目可以設定數位的大小:
int x[ ] = { 0, 1, 2 }
如果您指定大小,並提供錯誤的初始化表達式數目,編譯程式會產生錯誤。
Microsoft 專屬的
陣列的大小上限是由 size_t所定義。
結束 Microsoft 特定內容
範例
此範例顯示陣列的初始化表達式。
int P[4][3] =
{
{ 1, 1, 1 },
{ 2, 2, 2 },
{ 3, 3, 3,},
{ 4, 4, 4,},
};
這個語句會 P 宣告為四到三個數位,並將第一個數據列的元素初始化為 1、第二個數據列的元素到 2,依序初始化至第四個數據列。 第三個和第四個數據列的初始化表達式清單包含最後一個常數表達式之後的逗號。 最後一個初始化表示式清單 ({4, 4, 4,},) 後面接著逗號。 允許這些額外的逗號,但並非必要。 只需要將常數表達式與彼此分隔的逗號,以及將一個初始化運算式清單與另一個分隔的逗號。
如果匯總成員沒有內嵌初始化表達式清單,則會依序將值指派給子匯總的每個成員。 因此,上一個範例中的初始化相當於下列範例:
int P[4][3] =
{
1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4
};
大括弧也可以出現在清單中的個別初始化表達式周圍,並有助於釐清範例。
當您初始化匯總變數時,必須小心使用大括弧和初始化表達式清單。 下列範例將詳細說明編譯程式的大括弧解譯:
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 */
};
在此範例中, nlist 會宣告為結構 2 位元組 3 陣列,每個結構都有三個成員。 初始化的第 1 列會將值指派給 的第一個數據列 nlist,如下所示:
第 1 列的第一個左大括弧會發出編譯程式,表示第一個匯總成員
nlist(也就是,nlist[0]) 的初始化開始。第二個左大括弧表示第一個匯總成員
nlist[0]的初始化(也就是 結構在nlist[0][0]) 的開頭。第一個右大括弧結束結構的
nlist[0][0]初始化;下一個左大括弧開始初始化nlist[0][1]。此程式會繼續直到行尾,其中右大括弧結束初始化。
nlist[0]
第 2 列會以類似的方式,將值指派給 的第二個數據列 nlist 。 在數據列 1 和 2 上括住初始化表達式的外部大括弧集合是必要的。 下列建構會省略外大括弧,會造成錯誤:
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 */
};
在這個建構中,第 1 行的第一個左大括弧開始初始化 nlist[0],這是三個結構的數位。 值 1、2 和 3 會指派給第一個結構的三個成員。 遇到下一個右大括號(值 3 之後),初始化 nlist[0] 完成,且三個結構陣列中的兩個剩餘結構會自動初始化為 0。 同樣地, { 4,5,6 } 初始化 的第二個數據列中 nlist的第一個結構。 的其餘兩個結構 nlist[1] 會設定為 0。 當編譯程式遇到下一個初始化表示式清單時, { 7,8,9 } 它會嘗試初始化 nlist[2]。 由於 nlist 只有兩個數據列,因此此嘗試會造成錯誤。
在下一個範例中,的三 int 個成員 x 分別初始化為 1、2 和 3。
struct list
{
int i, j, k;
float m[2][3];
} x = {
1,
2,
3,
{4.0, 4.0, 4.0}
};
在結構中list,第一個數據列中的三個元素會初始化為4.0;其餘數據列mm的項目預設會初始化為0.0。
union
{
char x[2][3];
int i, j, k;
} y = { {
{'1'},
{'4'}
}
};
在此範例中,聯集變數 y會初始化。 等位的第一個專案是數位,因此初始化運算式是匯總初始化運算式。 初始化表達式清單 {'1'} 會將值指派給陣列的第一個數據列。 由於清單中只會顯示一個值,因此第一個數據行中的元素會初始化為字元 1,而且數據列中的其餘兩個元素預設會初始化為值0。 同樣地,的第二個數據列 x 的第一個元素會初始化為 字元 4,而數據列中剩餘的兩個專案會初始化為值0。