出于某种原因,我认为 C 和 C++ 是这样工作的:
int foo[10] = {57};
for (int i=0; i<10; ++i)
assert (foo[i] == 57);
结果剩下的整数被初始化为0,而不是57。我从哪里得到这个想法?这是真的吗?结构初始化列表是否曾经如此?当分配给 = {} 和 = {0} 时,数组和结构什么时候开始整齐正确地初始化为 0 值?我一直认为他们会初始化为垃圾,除非另有明确说明。
出于某种原因,我认为 C 和 C++ 是这样工作的:
int foo[10] = {57};
for (int i=0; i<10; ++i)
assert (foo[i] == 57);
结果剩下的整数被初始化为0,而不是57。我从哪里得到这个想法?这是真的吗?结构初始化列表是否曾经如此?当分配给 = {} 和 = {0} 时,数组和结构什么时候开始整齐正确地初始化为 0 值?我一直认为他们会初始化为垃圾,除非另有明确说明。
只要初始化程序存在,它就一直如此。C89 说:
如果列表中的初始化程序少于聚合的成员,则聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同。
我从哪里得到这个想法?
这显然是一个相对普遍的误解,因为我最近从其他一些人那里听到了同样的事情。也许你从其他人那里得到了这个错误的想法,或者这个想法只是“直觉的”。
{}
初始化至少可以追溯到 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