众所周知,标量数组的缺少初始值设定值默认为零。
int A[5]; // Entries remain uninitialized
int B[5]= { 0 }; // All entries set to zero
但是这(下面)有保证吗?
int C[5]= { }; // All entries set to zero
答案 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-initialized到A
,否则不会执行任何操作,它们将是不确定的值。
答案 2 :(得分:2)
事实上当你说int A[5] = { 0 };
时
你是说:将第一个元素初始化为零。由于聚合的原始化,所有其他职位都被初始化为零。
这一行真正负责让您的数组充满零:int A[5] = { };
这就是为什么如果你使用int A[5] = { 1 };
,你只会把第一个位置原谅为1。