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

msc*_*msc 15 c arrays

这是初始化数组的一种不常见的方法:

 int a[3] = {[2] 5, [0] 10, [1] 15};
Run Code Online (Sandbox Code Playgroud)

在程序中使用此数组,

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

a[0] = 10  a[1] = 15   a[2] = 5
Run Code Online (Sandbox Code Playgroud)

在线编译链接: http ://code.geeksforgeeks.org/4onQAI

所以,我有一个问题:

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

dbu*_*ush 19

关.正确的方法如下:

int a[3] = {[2] = 5, [0] = 10, [1] = 15};
Run Code Online (Sandbox Code Playgroud)

这是一个指定的初始值设定项,允许您初始化指定的元素.未指定的任何元素都设置为0.

这在C标准的第6.7.9节中规定.

您显示的语法是某些编译器支持的非标准扩展,特别是GCC.如果您要编译-pedantic,您将收到以下警告:

警告:过时使用指定的初始化程序而不使用'='


das*_*ght 11

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

int a[3] = {[2] = 5, [0] = 10, [1] = 15};
Run Code Online (Sandbox Code Playgroud)

自GCC 2.5以来已经过时的替代语法已经过时,但GCC仍然接受的是在元素值之前写'[index]',没有'='.(参考)

省略=不是标准的,不应该用于新的开发.

  • @NectarM这就是引用部分所说的:"在元素值之前写'[index]',没有'='" (2认同)

hac*_*cks 7

使用指定初始化程序的正确方法是

int a[3] = {[2] = 5, [0] = 10, [1] = 15};  
Run Code Online (Sandbox Code Playgroud)

根据C标准,应该=[index]和之间.
初始化的方式可能是一些扩展.

用于初始化的语法(C11-§6.7.9)

    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