首頁 >後端開發 >C++ >何時在陣列的 C 聚合初始化中使用大括號?

何時在陣列的 C 聚合初始化中使用大括號?

Barbara Streisand
Barbara Streisand原創
2024-12-07 03:42:11367瀏覽

When to Use Braces in C   Aggregate Initialization with Arrays?

包含數組的聚合的不明確初始化語法

在C 中,初始化包含數組的聚合時,省略花括號可能會導致混亂和錯誤。這在以下範例中很明顯:

// Error: Too many initializers
std::array<A, 2> a1 = {
    {0, 0.1},
    {2, 3.4}
};

// Valid
std::array<double, 2> a2 = {0.1, 2.3};

結構的std::array 需要大括號

第一個範例拋出錯誤,因為std:: array 是聚合且缺少使用者定義的建構子。其內部數組的初始化需要明確大括號,如更正版本所示:

std::array<A, 2> a1 = {
    {{0, 0.1}, {2, 3.4}}
};

POD 的std::array 不需要大括號

相反, std::array第二個範例中不需要大括號,因為double 是普通舊資料型別(POD),且陣列初始化由預設初始化程序有效處理。

聚合的一致性

聚合成員需要大括號的原則也適用於其他類型的聚合,例如好吧:

// Valid
B meow1 = {1, 2};
B bark1 = {{1, 2}};

C meow2 = {1, 2};
C bark2 = {{1, 2}};

D中的歧義

但是,以下範例會導致錯誤:

// Error: Too many initializers
D meow3 = {{1, 2}, {3, 4}};
D bark3 = {{{1, 2}, {3, 4}}};

在 D 中,初始化器因為 foo 本身就是一個陣列。 meow3 中的大括號不明確,因為它們可以引用 foo 的初始化或其內部陣列。為了解決歧義,需要明確大括號,如 bark3 中。

初始化聚合的機制

當聚合初始化中省略大括號時,適用以下規則:

  1. 如果成員聚合的初始值設定項目以大括號開頭,則將其視為全花括號初始化,並且大括號內的所有成員都被初始化。
  2. 如果初始化器不以大括號開頭,則僅從清單中取得足夠的初始化器來初始化聚合的成員;任何剩餘的初始化器都用於父聚合的下一個成員。

其他例子

  • 完全支撐初始化: { {1, 3, 5}, {2, 4, 6}, {3, 5, 7} }
  • 內部聚合省略了大括號: { 1, 3, 5, 2, 4, 6, 3, 5, 7 }
  • 不清楚文法: { {1, 3, 5}, {2, 4, 6}, 3, 5, 7 } (既不是完全支撐也不是省略支撐)

以上是何時在陣列的 C 聚合初始化中使用大括號?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn