Heim >Backend-Entwicklung >C++ >Wann werden geschweifte Klammern bei der C-Aggregatinitialisierung mit Arrays verwendet?

Wann werden geschweifte Klammern bei der C-Aggregatinitialisierung mit Arrays verwendet?

Barbara Streisand
Barbara StreisandOriginal
2024-12-07 03:42:11370Durchsuche

When to Use Braces in C   Aggregate Initialization with Arrays?

Mehrdeutige Initialisierungssyntax für Aggregate, die Arrays enthalten

In C kann das Weglassen von geschweiften Klammern beim Initialisieren von Aggregaten, die Arrays enthalten, zu Verwirrung und Fehlern führen. Dies wird in den folgenden Beispielen deutlich:

// 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};

Klammern erforderlich für std::array von Strukturen

Das erste Beispiel gibt einen Fehler aus, weil std::array ist ein Aggregat und es fehlt ein benutzerdefinierter Konstruktor. Die Initialisierung seines internen Arrays erfordert explizite geschweifte Klammern, wie in der korrigierten Version zu sehen ist:

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

Klammernklammern nicht erforderlich für std::array von PODs

Im Gegensatz dazu std::array Im zweiten Beispiel sind keine geschweiften Klammern erforderlich, da double ein einfacher alter Datentyp (POD) ist und die Array-Initialisierung effektiv vom Standardinitialisierer durchgeführt wird.

Konsistenz für Aggregate

Der Grundsatz, dass Klammern für Aggregatmitglieder erforderlich sind, gilt auch für andere Aggregattypen wie z na ja:

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

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

Mehrdeutigkeit in D

Das folgende Beispiel führt jedoch zu einem Fehler:

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

In D der Initialisierer denn foo ist selbst ein Array. Die geschweiften Klammern in meow3 sind mehrdeutig, da sie sich entweder auf die Initialisierung von foo oder auf sein internes Array beziehen könnten. Um die Mehrdeutigkeit aufzulösen, sind explizite geschweifte Klammern erforderlich, wie in bark3.

Mechanismus zur Initialisierung von Aggregaten

Wenn geschweifte Klammern bei der Aggregatinitialisierung weggelassen werden, gelten mehrere Regeln:

  1. Wenn der Initialisierer für ein Mitgliedsaggregat mit einer geschweiften Klammer beginnt, wird er als vollständig geschweifte Klammer behandelt Initialisierung, und alle Mitglieder innerhalb der geschweiften Klammern werden initialisiert.
  2. Wenn der Initialisierer nicht mit einer geschweiften Klammer beginnt, werden nur genügend Initialisierer aus der Liste entnommen, um die Mitglieder des Aggregats zu initialisieren; Alle verbleibenden Initialisierer werden für das nächste Mitglied des übergeordneten Aggregats verwendet.

Zusätzliche Beispiele

  • Vollständig geklammerte Initialisierung: { {1, 3, 5}, {2, 4, 6}, {3, 5, 7} }
  • Klammern für inneres Aggregat entfernt: { 1, 3, 5, 2, 4, 6, 3, 5, 7 }
  • Mehrdeutige Syntax: { {1, 3, 5}, {2, 4, 6}, 3, 5, 7 } (weder vollständig verstrebt noch ohne Klammern)

Das obige ist der detaillierte Inhalt vonWann werden geschweifte Klammern bei der C-Aggregatinitialisierung mit Arrays verwendet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn