Я думаю, що стандарт 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 };
призводить до невказаної поведінки. Присвоєння to a[2]
є побічним ефектом, і порядок оцінки виразів невизначено послідовно послідовно взаємопов'язаний один з одним. Отже, я не думаю, що існує спосіб звернутися до стандарту і стверджувати, що певний компілятор обробляє це правильно чи неправильно.
a[2]=1
оцінюється на1
.