Это правильный способ инициализации массива?

Вот один не очень распространенный способ инициализации массива:

 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;
}

Вывод:

a[0] = 10  a[1] = 15   a[2] = 5

Ссылка на онлайн-компилятор: http://code.geeksforgeeks.org/4onQAI

Итак, у меня есть вопрос:

Правильно ли он инициализирует массив?

Ответы

Ответ 1

Закрыть. Правильный способ:

int a[3] = {[2] = 5, [0] = 10, [1] = 15};

Это назначенный инициализатор, который позволяет инициализировать указанные элементы. Любые элементы, не указанные, установлены в 0.

Это указано в разделе 6.7.9 стандарта C.

Синтаксис, который вы показываете, является нестандартным расширением, поддерживаемым некоторыми компиляторами, в частности GCC. Если вы хотите скомпилировать с -pedantic, вы получите следующее предупреждение:

предупреждение: устаревшее использование назначенного инициализатора без '=

Ответ 2

В этом фрагменте кода используется устаревший синтаксис для этого назначенного инициализатора:

int a[3] = {[2] = 5, [0] = 10, [1] = 15};

Альтернативный синтаксис для этого, который был устаревшим, поскольку GCC 2.5, но GCC по-прежнему принимает, должен написать '[index] перед значением элемента, без' =. (ссылка)

Опускание = не является стандартным и не должно использоваться для новой разработки.

Ответ 3

Правильный способ использования назначенного инициализатора -

int a[3] = {[2] = 5, [0] = 10, [1] = 15};  

Между [index] и значением в соответствии со стандартом C. должно быть =.
То, как вы инициализируетесь, может быть некоторым расширением.

Граммер для инициализаций (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