ホームページ >バックエンド開発 >C++ >配列を使用した C 集計の初期化で中括弧を使用する場合は?

配列を使用した C 集計の初期化で中括弧を使用する場合は?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-07 03:42:11370ブラウズ

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 2 番目の例では、double は Plain Old Datatype (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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。