//Language C
int main()
{
int a[5]={0};
for(int i=0 ; i < 4 ; i++ )
printf("%d",a[i]);
}
}
以下输出为gcc中的1000。但我认为它应该打印1并休息垃圾值,因为我没有为其他数组位置分配值。
如果不考虑编译器版本,我的想法是对的吗?或者我错过了一些东西。
答案 0 :(得分:4)
C标准(引用最新的C11草案N1570)很好地解释了这一点。
§6.7.9初始化,第21页:
如果括号括起的列表中的初始值设定项少于元素或成员 用于初始化已知数组的字符串文字中的聚合或更少字符 大小比数组中的元素大,聚合的其余部分应为 隐式初始化与具有静态存储持续时间的对象相同。
(强调我的)
因此,代码中除a[0]
之外的所有元素都是隐式初始化。现在让我们来看看这意味着什么:
§6.7.9初始化,第10页:
如果没有显式初始化具有自动存储持续时间的对象,则其值为 不定。如果未初始化具有静态或线程存储持续时间的对象 明确,然后:
- 如果它有指针类型,则将其初始化为空指针;
- 如果它有算术类型,则初始化为(正或无符号)零;
- 如果是聚合,则根据这些规则初始化(递归)每个成员, 并且任何填充都初始化为零位;
- 如果它是一个联合,则根据这些第一个初始化(递归)第一个命名成员 规则,任何填充都初始化为零位;
(再次强调我的)
因此,a[1]
到a[4]
被初始化为0
- 类型int
是算术类型。