3

何らかの理由で、C と C++ は次のように機能するという考えがありました。

int foo[10] = {57};
for (int i=0; i<10; ++i)
    assert (foo[i] == 57);

残りの int は 57 ではなく 0 に初期化されていることがわかりました。このアイデアはどこから得たのでしょうか? これはある時点で真実でしたか?構造初期化子リストについてはこれまで真実でしたか? = {} および = {0} に割り当てられたときに、配列と構造体が適切かつ正確に 0 の値に初期化されるようになったのはいつですか? 明示的に別の指示がない限り、それらはガベージに初期化されるといつも思っていました。

4

2 に答える 2

10

初期化子が存在する限り、これは永遠にこの方法でした。C89 言います:

集合体のメンバーよりもリスト内の初期化子が少ない場合、集合体の残りの部分は、静的ストレージ期間を持つオブジェクトと同じように暗黙的に初期化されます。

于 2012-08-28T17:01:32.913 に答える
2

このアイデアはどこから得たのですか?

最近、他の多くの人から同じことを聞いたので、それは明らかに比較的一般的な誤解です. おそらく、あなたはこの間違った考えで他の誰かからそれを拾ったか、あるいはその考えは単に「直感的」である.

{}初期化は、少なくとも C89 までさかのぼって機能します。私は、これまでに異なる方法で動作したこと、またはこれまでに異なる方法で動作したコンパイラを認識していません。

集約型 (配列など) を初期化するときの初期化子リストの場合:

集約内のメンバーよりもリスト内の初期化句が少ない場合、明示的に初期化されていない各メンバーは、空の初期化子リスト (8.5.4) から初期化されます。— 集約 [dcl.init.aggr] 8.5.1p7

C++ の用語では、空の初期化子を使用すると、オブジェクトは値で初期化されます。

タイプ T のオブジェクトを値で初期化するとは、次のことを意味します。

— T がユーザー提供のコンストラクター (12.1) を持つ (おそらく cv 修飾された) クラス型 (第 9 節) である場合、T のデフォルト コンストラクターが呼び出されます (T にアクセス可能なデフォルト コンストラクターがない場合、初期化の形式は正しくありません);

— T が (おそらく cv 修飾された) 非共用体クラス型であり、ユーザー提供のコンストラクターがない場合、オブジェクトはゼロで初期化され、T の暗黙的に宣言された既定のコンストラクターが自明でない場合、そのコンストラクターが呼び出されます。

— T が配列型の場合、各要素は値で初期化されます。

— それ以外の場合、オブジェクトはゼロで初期化されます。

                                                                                              — 初期化子 [dcl.init] 8.5p7

于 2012-08-28T17:04:00.983 に答える