C 这是初始化数组的正确方法吗?

C 这是初始化数组的正确方法吗?,c,arrays,C,Arrays,以下是初始化阵列的一种不太常见的方法: int a[3] = {[2] 5, [0] 10, [1] 15}; 在程序中使用此数组 #include <stdio.h> int main() { //code int a[3] = {[2] 5, [0] 10, [1] 15}; printf("a[0] = %d a[1] = %d a[2] = %d\n", a[0], a[1], a[2]); return 0; } 联机编译器链接

以下是初始化阵列的一种不太常见的方法:

 int a[3] = {[2] 5, [0] 10, [1] 15};
在程序中使用此数组

#include <stdio.h>

int main() {
    //code
    int a[3] = {[2] 5, [0] 10, [1] 15};
    printf("a[0] = %d  a[1] = %d   a[2] = %d\n", a[0], a[1], a[2]);
    return 0;
}
联机编译器链接:

因此,我有一个问题:


这是初始化数组的正确方法吗?关闭。正确的方法如下:

int a[3] = {[2] = 5, [0] = 10, [1] = 15};
这是一个指定的初始值设定项,允许您初始化指定的元素。任何未指定的元素都设置为0

本规范第6.7.9节对此进行了规定

您显示的语法是一些编译器(特别是GCC)支持的非标准扩展。如果使用
-pedantic
进行编译,您将收到以下警告:

警告:不带“=”的指定初始值设定项已过时


您的代码段对此指定的初始值设定项使用了过时的语法:

int a[3] = {[2] = 5, [0] = 10, [1] = 15};
这方面的另一种语法自GCC 2.5以来已经过时,但GCC仍然接受,即在元素值之前写入“[index]”,不使用“=”。()


省略
=
不是标准,不应用于新开发。

使用指定初始值设定项的正确方法是

int a[3] = {[2] = 5, [0] = 10, [1] = 15};  
根据C标准,
[索引]
和值之间应该有
=

您初始化的方式可能会导致某些扩展

初始化语法(C11-§6.7.9)

初始值设定项: 赋值表达式 {初始值设定项列表} {初始值设定项列表,} 初始值设定项列表: 指定初始值设定项 初始值设定项列表,指定初始值设定项 任命: 指示符列表= 指示符列表: 指示符 指示符列表指示符 代号: [恒定表达式] . 标识符
printf(“%d\n”,a[2])编译?不,这不是初始化数组的正确方法。这是无效的,C++和C++不是SAMEICC接受的,因为GCC接受它。但这并不正确。很明显,OP所问的是什么。投票重新打开。上面问题中的否数组的初始化是不同的。@NectarM这就是引用部分所说的:“在元素值之前写“[index]”,不带“=”“为什么以及在哪里使用这种类型的初始化?@NectarM如果你指的是旧语法,我们不应该再使用它。至于新的,它是为了简化稀疏阵列的初始化。C99不是“C标准”。这是C11,草案n1570。请参阅@Olaf更新链接以指向C11文档。感谢您给出答案。。。
int a[3] = {[2] = 5, [0] = 10, [1] = 15};  
initializer: assignment-expression { initializer-list } { initializer-list , } initializer-list: designationopt initializer initializer-list , designationopt initializer designation: designator-list = designator-list: designator designator-list designator designator: [ constant-expression ] . identifier