Я думаю, что стандарт 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]
является побочным эффектом, и порядок вычисления выражений последовательно определяется по отношению друг к другу.Следовательно, я не думаю, что есть способ обратиться к стандарту и утверждать, что определенный компилятор обрабатывает это правильно или неправильно.