Я думаю, что стандарт C11 охватывает это поведение и говорит, что результат не указан , и я не думаю, что C18 внес какие-либо существенные изменения в этой области.
Стандартный язык разобрать непросто. Соответствующий раздел стандарта - это
§6.7.9 Инициализация . Синтаксис задокументирован как:
initializer:
assignment-expression
{ initializer-list }
{ initializer-list , }
initializer-list:
designation
opt
initializer
initializer-list , designation
opt
initializer
designation:
designator-list =
designator-list:
designator
designator-list designator
designator:
[ constant-expression ]
. identifier
Обратите внимание, что одним из терминов является выражение-присваивание , и поскольку a[2] = 1
это, несомненно, выражение присваивания, оно разрешено внутри инициализаторов для массивов с нестатической продолжительностью:
§4 Все выражения в инициализаторе для объекта, который имеет статическую продолжительность или продолжительность хранения потока, должны быть постоянными выражениями или строковыми литералами.
Один из ключевых абзацев:
§19 Инициализация должна происходить в порядке списка инициализаторов, каждый инициализатор, предусмотренный для конкретного подобъекта, отменяет любой ранее перечисленный инициализатор для того же подобъекта; 151)
все подобъекты, которые не инициализированы явно, должны быть инициализированы неявно так же, как объекты, которые имеют статическую продолжительность хранения.
151) Любой инициализатор для подобъекта, который переопределяется и поэтому не используется для инициализации этого подобъекта, может вообще не оцениваться.
И еще один ключевой абзац:
§23 Вычисления выражений списка инициализации неопределенно упорядочены относительно друг друга, и поэтому порядок, в котором возникают какие-либо побочные эффекты, не определен. 152)
152) В частности, порядок оценки может не совпадать с порядком инициализации подобъекта.
Я почти уверен, что параграф §23 указывает на то, что обозначения в вопросе:
int a[5] = { a[2] = 1 };
приводит к неопределенному поведению. Присваивание a[2]
является побочным эффектом, и порядок оценки выражений неопределенно упорядочен по отношению друг к другу. Следовательно, я не думаю, что есть способ апеллировать к стандарту и утверждать, что конкретный компилятор обрабатывает это правильно или неправильно.
a[2]=1
оценивается как1
.