2016-07-12 14 views
7

В этом посте: https://stackoverflow.com/questions/38326930/cannot-read-full-100000-integer-values-from-a-file-in-cДействительно ли инициировать размерную часть VLA в той же последовательности, что и VLA?

ОП содержит код, где есть много плохого, но одна линия сделал мне особенно любопытными, так как я не был в состоянии смотреть что-нибудь вверх, запрещая его.

Это специфическая линия:

int n = 100000, arr[n]; 

ли порядок объявления и инициализации неоспоримым обеспечивается?

Итак, я бы предположил, что может случиться так, что n не был инициализирован, когда объявляется arr, что, казалось бы, было бы нехорошо.

Но я не смог найти никаких утверждений об этом в проекте iso/iec 9899, ​​не заявив, что он не определен или не определяет его.

Так это, как я предполагаю, не определено поведение? Или это не так?

И в любом случае, то, что правило неоспоримым для этого применены результат 5

Edit:

Это справедливо для C99, тоже?

+0

В этой строке нет _comma operator_. Декларация не является заявлением! – Olaf

+0

@ Олаф: Ах, вы правы, меня уже учили, что здесь запятая выполняет другую работу. Но это меняет результат? делает ли разделение для commatares в декларации порядком? – dhein

+0

Откат назад. Пожалуйста, не редактируйте вопрос после того, как вы получили ответ, так что ответ теряет контекст. – Olaf

ответ

-1

Вкратце: Ваш код верный. Это ваша предпосылка, которая неправильна. Эти два объявления не являются «в одной и той же точке последовательности». (В качестве опоры: ничего не может быть в точка, но только между двумя точками, точки безразмерны).

Детали:

6.8.2 стандарта показывает грамматику составного оператора, который является основой для каждой функции тела:

compound-statement: 
    { block-item-listopt } 
block-item-list: 
    block-item 
    block-item-list block-item 
block-item: 
    declaration 
    statement 

Соответствующие здесь является блок-пункт. Как показано, это может быть заявление или заявление . Это означает, что заявление не является заявлением . Показывают декларацию, поэтому , не является оператор здесь, но отделяет Инициализационных-declaratorsописателя необязательно с Инициализатором см 6.7 для грамматики). И есть точка последовательности сразу после объявления (и перед необязательным инициализатором, кстати.).

6.7.6p3: Полный декларатор является декларатором, который не является частью другого декларатора. Конец полного декларатора - это точка последовательности. Если во вложенной последовательности деклараторов в полном объявлении имеется декларатор, определяющий тип массива переменной длины, тип, указанный полным декларатором, называется изменчивым. Кроме того, любой тип, полученный путем вывода типа декларатора из измененного типа, сам по себе изменен.

Что касается «порядка выполнения»: это фактически остается для реализации. Но стандарт требует следовать абстрактной машине. Точки последовательности - это фундаментальная концепция упорядочения.


Вопрос на самом деле не имеет прямого отношения к VLA, но деклараторы в целом. Без цитирования разделов всех предыдущих версий поведение одинаково во всех версиях, потому что иначе что-то вроде int i = 3, k = i; тоже не сработало бы (оно).

+2

Что вы из этого делаете? Я также просмотрел материал, который вы ссылаетесь, прежде чем отправлять сообщения, но я все еще не вижу, где это говорится. – dhein

+0

@Zaibis: Извините, я поймал неправильный абзац. См. Редактирование. – Olaf

+0

@Olaf: интересно. Какую версию документа вы ссылаетесь? Когда я выполнил полный поиск по моему документу, ища «массив переменной длины», я не нашел этот абзац. – dhein