出于某种原因,我认为C和C ++的工作方式如下:
int foo[10] = {57};
for (int i=0; i<10; ++i)
assert (foo[i] == 57);
原来剩下的整数被初始化为0而不是57.我从哪里得到这个想法?这一点是真的吗?结构初始化列表是否真的如此?当分配给= {}和= {0}时,数组和结构是否整齐且正确地开始将自己初始化为0值?除非另有说明,否则我一直认为他们会初始化为垃圾。
答案 0 :(得分:10)
只要初始化程序存在,就一直都是这样。 C89说:
如果列表中的初始值设定项少于a的成员 总计,集合的其余部分应初始化 隐式地与具有静态存储持续时间的对象相同。
答案 1 :(得分:2)
我从哪里得到这个想法?
这显然是一种相对常见的误解,因为我最近听到了很多其他人的同样的话。也许你是从别人那里拿出来的,但这个想法可能只是“直观”。
{}
初始化至少可以追溯到C89。我不知道它的工作方式不同,或者任何编译器都做过不同的工作。
初始化聚合类型(如数组)时的初始化列表:
如果列表中的initializer-clause少于聚合中的成员,则未显式初始化的每个成员都应从空的初始化列表(8.5.4)初始化。 - 聚合[dcl.init.aggr] 8.5.1p7
在C ++术语中,当您使用空初始化程序时,该对象是值初始化的。
要值初始化 T类型的对象意味着:
- 如果T是(可能是cv限定的)类类型(第9条),带有 用户提供的构造函数(12.1),然后是T的默认构造函数 被调用(如果T无法访问,则初始化是错误的 默认构造函数);
- 如果T是一个(可能是cv限定的)非联合类类型而没有 用户提供的构造函数,然后该对象被零初始化,如果 T的隐式声明的默认构造函数是非平凡的 构造函数被调用。
- 如果T是数组类型,则每个元素都是值初始化的;
- 否则,该对象为零初始化。
- 初始化程序[dcl.init] 8.5p7