3

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有什么解释吗?

4

2 回答 2

3

使用指定初始值设定项与元素初始值设定项相结合意味着基于指定初始值设定项的位置。

因此,如果您要这样做:

int a[] = {2, 1, [3] = 5, 6};

结果应该是:

2 1 0 5 6

不是:

2 1 0 6

请注意,6 在初始化程序中占据位置 3,但其结果位置由前面指定的初始化程序(使用位置 3)隐含。指定初始化器使用的位置后面的位置是 4,所以这就是放置 6 的位置。

于 2013-06-29T21:02:06.243 回答
1

使用初始化器初始化数组的过程基本上是:

  1. 将索引计数器设置为 0,并将整个数组初始化为 0s
  2. 从左到右遍历初始化器元素
  3. 如果初始值设定项元素具有指定索引,则将索引计数器设置为指定索引
  4. 将初始值设定项元素值存储在索引计数器给定的索引处
  5. 增加索引计数器
  6. 如果还有更多初始化器元素,请返回第 3 步。
于 2013-06-30T18:12:17.053 回答