2016-08-23 4 views
15

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

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

'Е ("% d \ N" ,, а [2]);' скомпилированы? –

+1

Нет, это не правильный способ инициализации массива. Это недопустимо C++. –

+0

@Sourav Да, в gcc скомпилирован успешно. –

ответ

19

Закрыть. Правильный путь заключается в следующем:

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

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

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

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

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

+0

C99 не является «стандартом C». Это C11 с черновиком n1570. См. [Предисловие] (http://port70.net/~nsz/c/c11/n1570.html#Forewordp6) – Olaf

+0

@Olaf Обновлена ​​ссылка, чтобы указать на документ C11. – dbush

+0

Спасибо, что ответили ... –

11

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

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

альтернативный синтаксис для этого, который был устаревшим, так как GCC 2.5, но до сих пор GCC принимает это написать «[индекс]» перед элементом V alue, без '='. (reference)

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

+0

нет в верхнем вопросе инициализация массива отличается. –

+2

@NectarM Это то, о чем говорится в цитате: «write» [index] »перед значением элемента, без« = »« – dasblinkenlight

+0

почему и где этот тип инициализации мы используем? –

7

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

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

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

Грамматика для инициализаций (С11-§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 
Смежные вопросы