インターネットから次のコードを取得しました。
struct {
int x;
struct {
int y, z;
} nested;
} i = { .nested.y = 5, 6, .x = 1, 2 };
結果は次のとおりです。
i.nested.y = 2
i.nested.z = 6
しかし、理由はわかりません。ネットの記事には説明がありません。
これを指摘してくれた Jens に感謝します。
「いつものように」連続する要素を単純に初期化していますが、デジグネータは現在の要素を最初に に変更するために使用され.nested.y
、初期化されてから5
後続の要素.nested.z
が を取得6
します。最後2
は上書きします.nested.y
。
これはかなり難読化されたコードです。イニシャライザの数が構造体のフィールド数よりも多いためint
、何か「怪しい」(別名「賢い」) ことが起こっています。
わかりました、まず最初に、これは構造体を初期化するためのひどい方法であり、宿題の質問である場合は、あまり良い方法ではないことを言わせてください。しかし、当面の問題を考えると、初期化で起こっていると私が信じていることは次のとおりです。最初に、y が 5 に初期化され、構造体の次のメンバーである z が 6 に初期化されます。次に、x が 1 に初期化されます。構造体の次のメンバー (この場合は y) は 2 に初期化されます (5 が上書きされます)。
同様に注意すべき重要なことは、ネストされた構造体は共用体ではなく構造体であるということです-まず第一に、それがコードが言っていることですが、それが共用体である場合-この場合は不可能であるためですy と z は、メモリ内の同じ場所に保持されるため、異なる値を持つ必要があります。: Grijesh Chauhan が提供するリンクで Eran Zimmerman が回答したとおり