Creo que el estándar C11 cubre este comportamiento y dice que el resultado no está especificado , y no creo que C18 haya realizado cambios relevantes en esta área.
El lenguaje estándar no es fácil de analizar. La sección relevante de la norma es
§6.7.9 Inicialización . La sintaxis se documenta como:
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
Tenga en cuenta que uno de los términos es expresión de asignación , y dado a[2] = 1
que indudablemente es una expresión de asignación, se permite dentro de los inicializadores para matrices con duración no estática:
§4 Todas las expresiones en un inicializador para un objeto que tiene una duración de almacenamiento estática o en subprocesos serán expresiones constantes o literales de cadena.
Uno de los párrafos clave es:
§19 La inicialización ocurrirá en el orden de la lista de inicializadores, cada inicializador proporcionado para un subobjeto particular anulando cualquier inicializador previamente listado para el mismo subobjeto; 151)
todos los subobjetos que no se inicializan explícitamente se inicializarán implícitamente igual que los objetos que tienen una duración de almacenamiento estático.
151) Cualquier inicializador para el subobjeto que se anula y, por lo tanto, no se usa para inicializar ese subobjeto, podría no ser evaluado en absoluto.
Y otro párrafo clave es:
§23 Las evaluaciones de las expresiones de la lista de inicialización tienen una secuencia indeterminada entre sí y, por lo tanto, no se especifica el orden en el que ocurren los efectos secundarios. 152)
152) En particular, el orden de evaluación no necesita ser el mismo que el orden de inicialización del subobjeto.
Estoy bastante seguro de que el párrafo 23 indica que la notación en la pregunta:
int a[5] = { a[2] = 1 };
conduce a un comportamiento no especificado. La asignación a a[2]
es un efecto secundario, y el orden de evaluación de las expresiones está secuenciado indeterminadamente entre sí. En consecuencia, no creo que haya una forma de apelar al estándar y afirmar que un compilador en particular está manejando esto correcta o incorrectamente.
a[2]=1
evalúa como1
.