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