Это правильный способ инициализации массива?
Вот один не очень распространенный способ инициализации массива:
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