【问题标题】:Are the elements present after a designator initializes elements in strictly increasing manner?在指示符以严格递增的方式初始化元素之后元素是否存在?
【发布时间】:2017-09-14 16:54:05
【问题描述】:

在这里,我已经像这样初始化数组:

#include <stdio.h>

int main() 
{
    int a[10] = {1, 2, 3, [7] = 4, 8, 9};

    printf("a[7] = %d\na[8] = %d\na[9] = %d\n", a[7], a[8], a[9]);

    return 0;
}

输出:

a[7] = 4
a[8] = 8
a[9] = 9

在这里,我选择了数组索引7 作为a[7] = 4,然后添加了一些元素。然后打印索引7、8和9的数组元素并正确打印。

那么,在没有明确定义的情况下,索引8 和9 的输出是否正确? 为什么序列不是从索引3开始?

【问题讨论】:

标签: c arrays initialization initializer-list designated-initializer


【解决方案1】:

为什么序列不从索引 3 开始?

因为,这不是它的工作原理!!

引用 C11,第 6.7.9 章的 指定初始化程序(强调我的)

每个用大括号括起来的初始化列表都有一个关联的当前对象。没有时 指定存在,当前对象的子对象按顺序初始化 到当前对象的类型:下标递增顺序的数组元素,结构 声明顺序的成员,以及联盟的第一个命名成员。148) 。相比之下,一个 指定导致以下初始化程序开始子对象的初始化 由指定人描述。 然后按顺序继续初始化,开始 与指示符所描述的子对象之后的下一个子对象。149)

因此,在您的情况下,在指示符 [7] 之后,大括号括起来的列表中的剩余两个元素将用于初始化下一个子对象,即索引 8 和 9 中的数组元素。

只是为了添加一些更相关的信息,

如果指示符具有格式

[ constant-expression ]

那么当前对象(定义如下)应该是数组类型并且表达式应该是 一个整数常量表达式。 [...]

【讨论】:

    【解决方案2】:

    在没有明确定义的情况下,它是否正确输出了索引 8 和 9?

    是的,没错。编译器将在索引 7 之后初始化数组元素。
    初始化器将前三个元素初始化为1、2 和3。索引7 处的元素将具有值4。索引7 之后的两个元素将分别具有值8 和9。

    为什么序列不从索引 3 开始?

    指定初始化器[7] 告诉编译器在索引7 之后继续初始化数组元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      • 1970-01-01
      相关资源
      最近更新 更多