web-dev-qa-db-ja.com

ゼロの配列の初期化

スカラーの配列に欠落している初期化子がデフォルトでゼロに設定されていることはよく知られています。

int A[5]; // Entries remain uninitialized
int B[5]= { 0 }; // All entries set to zero

しかし、これは(以下)保証されていますか?

int C[5]= { }; // All entries set to zero
53
Yves Daoust

空のブレース初期化は、配列の集約初期化を実行します。これにより、int要素のゼロ初期化が行われます。

はい、これは保証されています。

67
Bathsheba

はい、 集約の初期化 のルールに従って、保証されています(配列Cのすべての要素は value-initialized 、つまり zero-初期化済み to 0この場合)。

(エンファシス鉱山)

初期化節の数がメンバーの数より少ない場合and bases (since C++17)または初期化リストが完全に空の場合、残りのメンバーand bases (since C++17)は、通常のリスト初期化ルールに従って、空のリストによってby their default initializers, if provided in the class definition, and otherwise (since C++14)が初期化されます(デフォルトのコンストラクターで非クラス型および非集約クラスの値初期化を実行し、集約の集約初期化を行います)。


PS:

int A[5]; // Entries remain uninitialized

「初期化されないまま」は正確ではない場合があります。 int A[5];の場合、Aのすべての要素は default-initialized になります。 Aが静的オブジェクトまたはスレッドローカルオブジェクトの場合、要素は zero-initialized to 0になります。そうでない場合は何も実行されず、不定の値になります。

35
songyuanyao

実際、あなたが言うときint A[5] = { 0 };あなたは言っている:最初の要素をゼロに初期化する。他のすべての位置は、集計の初期化のためにゼロに初期化されます。

この行は、配列をゼロで満たす実際の責任です:int A[5] = { };

int A[5] = { 1 };を使用すると、最初の位置が1に初期化されるだけです。

2
rain_