这是如何工作的(将所有值设置为0)?
int array[28]= {0};
以及为什么这不起作用(没有将所有值设置为4但只将第一个值设置为4而其他值设置为0)?
int array[28]= {4};
答案 0 :(得分:10)
在C中,初始化程序中未列出的任何元素都被隐式初始化为零值。
int array[28]= {0};
创建一个28个整数的数组,并将第一个元素初始化为0.初始化程序中未提及其余元素得到它们的零值,对于整数为0。
int array[28]= {4};
同样有效。第一个元素初始化为4,初始化程序中未提及的其余元素得到零值。
答案 1 :(得分:10)
未初始化的元素设置为0.在第一种情况下,通过将值设置为0来启动它,并且默认情况下将rest初始化为0.在第二种情况下,第一个值初始化为4并且休息为0.标准说:
如果括号括起的列表中的初始值设定项少于此值 是聚合的元素或成员,或者是一个或多个字符 string literal用于初始化已知大小的数组 是数组中的元素,聚合的其余部分应为 隐式初始化与具有静态存储的对象相同 持续时间。
答案 2 :(得分:2)
仅仅因为标准要求它。
ISO / IEC:9899(c99标准)TC3声明:
6.7.8初始化
[...]
21如果括号括起的列表中的初始值设定项少于元素或成员 用于初始化已知数组的字符串文字中的聚合或更少字符 大小比数组中的元素大,其余的聚合应该是 隐式初始化与具有静态存储持续时间的对象相同。
第10点的相同段落是什么: (强调我的)
10如果没有显式初始化具有自动存储持续时间的对象,则其值为 不定。 如果未明确初始化具有静态存储持续时间的对象, 然后强>:
- 如果它有指针类型,则将其初始化为空指针;
- 如果它有算术类型,则初始化为(正或无符号)零;
- 如果是聚合,则根据这些规则初始化(递归)每个成员;
- 如果是联合,则根据这些规则初始化(递归)第一个命名成员。
所以简单地说这必须发生,这就是它发生的原因。
答案 3 :(得分:1)
int array[5] = {0}
所有元素都将初始化为0
int array[5] = {1,2,3}
在这种情况下,第一个元素将初始化为1,第二个元素为2,第三个元素为3,其余元素为0。