2014-09-19 6 views
0

Стандартная сек. 8.3/4 говорит:Массив с неизвестными границами

Массив связан также могут быть опущены, когда описатель следует инициализатор (8.5).

Все нормально. Следующие отлично компилируется:

int a[] = {1}; 

int main() 
{ 
} 

DEMO

Но 8,3/4 также говорит

Когда несколько «массив» спецификации являются смежными, многомерный массив создается; только первый из констант выражения, которые определяют границы массивов, могут быть опущены.

и следующие

int a[][2]; 

int main() 
{ 
} 

не компилирует

DEMO

Но если мы добавим инициализатор следуют после описателя:

int a[][1] = {{1}}; 

int main() 
{ 
} 

DEMO

Он отлично работает. Хотя стандарт не указывает, что декларатор многомерного массива должен следовать инициализатором. Не могли бы вы объяснить это?

+1

Применяется обычное правило об исключении границ. 'int a [] [2]' - это точное объявление в функциональных параметрах или в контекстах, где допускаются неполные типы. Без инициализатора он объявляет массив 'a' неполного типа -" неизвестной границей массива из 2 'int'. –

ответ

5

«Также» в первой цитате относится к более ранним предложениям:

В дополнении к декларациям, в которых неполный тип объекта разрешен, массив, связанный может быть опущена в некоторых случаях в объявление параметра функции (8.3.5). Массив связан может также быть опущен, если описатель сопровождается инициализатором

текст не говорит об этом прямо, но намерение состоит в том, что массиве связан не может быть опущено, за исключением: (список случаев).

Код int a[][2]; не является объявлением, в котором допускается неполный тип объекта (например, int a[]; также является незаконным). Это не в объявлении параметра функции; а также декларатор, за которым следует инициализатор.

Таким образом, этот код не подпадает под любой из перечисленных случаев, когда разрешено опускать границу массива.


Ранее цитата:

только первый из константных выражений, которые определяют границы массивов могут быть опущены

означает, что оценки после первого не может быть опущено.

+0

Вы имеете в виду, что правило _ только первое из константных выражений, которые определяют границы массивов, может быть опущено_ для многомерного массива является общим, а в дополнительном ограничено правилом, которое требует инициализатора, за которым следует декларатор. Правильно? – 2014-09-19 05:42:03

+1

@DmitryFucintv Исправить. Это означает, что у вас не может быть таких типов, как «массив неизвестной границы массива неизвестной границы' int' »или« массив из 3 массива неизвестной границы 'int'» –

+0

@ T.C. Спасибо за уточнение. – 2014-09-20 06:42:10

0

Вы заявили, что

Хотя стандарт не определяет описатель из multidimensial массива должен следовать по инициализатору.

что не соответствует действительности. Многомерные массивы представляют собой массивы, поэтому ваш предыдущий цитированный оператор из стандарта об ограничении массива также применяется к ним (с добавленным ограничением).

Смежные вопросы