初始化零数组

时间:2016-08-11 09:30:20

标签: c++ arrays initialization language-lawyer

众所周知,标量数组的缺少初始值设定值默认为零。

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

但是这(下面)有保证吗?

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

3 个答案:

答案 0 :(得分:66)

空支撑初始化执行数组的聚合初始化:这导致int元素的零初始化。

是的,这是有保证的。

答案 1 :(得分:35)

是的,根据aggregate initialization的规则,它得到保证(数组C的所有元素都是value-initialized,即zero-initialized到{{} 1}}在这种情况下)。

(强调我的)

  

如果初始化程序子句的数量少于成员数0初始化程序列表完全为空,则其余成员and bases (since C++17)将被初始化and bases (since C++17)按空列表,按照通常的列表初始化规则(使用默认构造函数对非类类型和非聚合类执行值初始化,以及聚合的聚合初始化)。

PS:

by their default initializers, if provided in the class definition, and otherwise (since C++14)

"保持未初始化状态"可能不准确。对于int A[5]; // Entries remain uninitialized int A[5];的所有元素都将为default-initialized。如果A是静态或线程局部对象,则元素将为zero-initializedA,否则不会执行任何操作,它们将是不确定的值。

答案 2 :(得分:2)

事实上当你说int A[5] = { 0 };时 你是说:将第一个元素初始化为零。由于聚合的原始化,所有其他职位都被初始化为零。

这一行真正负责让您的数组充满零:int A[5] = { };

这就是为什么如果你使用int A[5] = { 1 };,你只会把第一个位置原谅为1。