Yve*_*ust 53 c++ arrays initialization language-lawyer
众所周知,标量数组的缺少初始值设定值默认为零.
int A[5]; // Entries remain uninitialized
int B[5]= { 0 }; // All entries set to zero
Run Code Online (Sandbox Code Playgroud)
但是这(下面)保证了吗?
int C[5]= { }; // All entries set to zero
Run Code Online (Sandbox Code Playgroud)
Bat*_*eba 68
空支撑初始化执行数组的聚合初始化:这导致int元素的零初始化.
是的,这是有保证的.
son*_*yao 35
是,根据该规则集合初始化,它保证(即数组的所有元素C将值初始化,即零初始化到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
Run Code Online (Sandbox Code Playgroud)
"保持未初始化"可能并不准确.因为int A[5];,所有元素都A将默认初始化.如果A是静态或线程局部对象,则元素将被零初始化为0,否则不执行任何操作,它们将是不确定的值.
rai*_*in_ 11
事实上,当你说int A[5] = { 0 };
你是在说:将第一个元素初始化为零。由于聚合初始化,所有其他位置都初始化为零。
这一行真正负责让你的数组充满零: int A[5] = { };
这就是为什么如果您使用,int A[5] = { 1 };您只会将第一个位置初始化为 1。