3

出于某种原因,我认为 C 和 C++ 是这样工作的:

int foo[10] = {57};
for (int i=0; i<10; ++i)
    assert (foo[i] == 57);

结果剩下的整数被初始化为0,而不是57。我从哪里得到这个想法?这是真的吗?结构初始化列表是否曾经如此?当分配给 = {} 和 = {0} 时,数组和结构什么时候开始整齐正确地初始化为 0 值?我一直认为他们会初始化为垃圾,除非另有明确说明。

4

2 回答 2

10

只要初始化程序存在,它就一直如此。C89 说:

如果列表中的初始化程序少于聚合的成员,则聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同。

于 2012-08-28T17:01:32.913 回答
2

我从哪里得到这个想法?

这显然是一个相对普遍的误解,因为我最近从其他一些人那里听到了同样的事情。也许你从其他人那里得到了这个错误的想法,或者这个想法只是“直觉的”。

{}初始化至少可以追溯到 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

于 2012-08-28T17:04:00.983 回答