C99提供了一个通过使用element-by-element
&designated
方法合并为:
int a[] = {2,1,[3] = 5,[5] = 9,6,[8] = 4};
运行代码时:
#include <stdio.h>
int main()
{
int a[] = {2,1,[3] = 5,[0] = 9,4,[6] = 25};
for(int i = 0; i < sizeof(a)/sizeof(a[0]); i++)
printf("%d ",a[i]);
return 0;
}
(注意Element 0
初始化为2
,然后再次由指示符[0]
初始化至9
)我原以为element 0
(即2
)将被9
(作为指示符[0] = 9
)取代因此o/p将变成
9 1 0 5 4 0 25
不幸的是,当o/p到来时,我错了;
9 4 0 5 0 0 25
对意外的o/p有什么解释吗?
将指定的初始化器与元素初始化器组合使用意味着基于指定初始化器的位置。
所以,如果你要做:
int a[] = {2, 1, [3] = 5, 6};
结果应该是:
2 1 0 5 6
不是:
2 1 0 6
请注意,6占据了初始化器中的位置3,但其结果位置由前面指定的初始化器(使用位置3)暗示。指定的初始化器使用的位置后面的位置是4,所以这就是6的位置。
用初始化器初始化数组的过程基本上是:
- 将索引计数器设置为0,并将整个数组初始化为0s
- 从左到右遍历初始值设定项元素
- 如果初始值设定项元素有指定的索引,请将索引计数器设置为指定的索引
- 将初始值设定项元素值存储在索引计数器给定的索引处
- 递增索引计数器
- 如果还有更多的初始值设定项元素,请返回步骤3