8

英語が下手でごめんなさい。

コード(C99以降)を想定します。

typedef struct {
    int a, b;
} foo_t;

foo_t f = { .a = 1, .b = 2  };

f = (foo_t){ .b = 3 };

今は何f.aですか?C規格はこれについて何か言っていますか?

部分的な初期化の場合、標準では、初期化されていないすべてのメンバーが「適切なゼロ」(0整数、0.0浮動小数点、NULLポインターなど)に初期化されることが保証されていることを知っています。しかし、最後のステートメントは(私が理解しているように)初期化ではありませんf。すでに存在しているからです。よくわかりません。

4

2 に答える 2

7

セクション6.5.2.5のポイント6C99標準の複合リテラルは次のように述べています。

複合リテラルの値は、初期化子リストによって初期化された名前のないオブジェクトの値です。

名前のないfoo_tものは、あなたが言及したのと同じルールによって、部分的に初期化されます。

最後のステートメントは割り当てですが、複合リテラルは初期化子リストによって初期化された名前のないオブジェクトです。unnamed.aは値がゼロでありf.a、割り当て後はゼロであることを意味します。

于 2013-01-08T14:30:48.143 に答える
5

この式では:

f = (foo_t){ .b = 3 };

(foo_t){ .b = 3 }foo_t複合リテラル、つまり、部分的に初期化される型の左辺値です。まだ部分的な初期化であるため、同じルールが適用されます。

C11 6.7.9 / 21:

中括弧で囲まれたリストの初期化子が集合体の要素またはメンバーよりも少ない場合、または既知のサイズの配列を初期化するために使用される文字列リテラルの文字数が配列内の要素よりも少ない場合、集合体の残りの部分は静的な保存期間を持つオブジェクトと同じように暗黙的に初期化されます。

に割り当てるのは、複合リテラルが初期化された後でのみですf

これと同等です:

foo_t f = { .a = 1, .b = 2  };
foo_t c = { .b = 3 };
f = c;

複合リテラルに精通していない場合は、GCCにそのための優れたドキュメントがあります。

于 2013-01-08T14:31:27.723 に答える