Je pense que la norme C11 couvre ce comportement et dit que le résultat n'est pas spécifié , et je ne pense pas que C18 ait apporté des changements pertinents dans ce domaine.
Le langage standard n'est pas facile à analyser. La section pertinente de la norme est le
§6.7.9 Initialisation . La syntaxe est documentée comme suit:
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
Notez que l'un des termes est expression d'affectation , et comme il a[2] = 1
s'agit indubitablement d'une expression d'affectation, il est autorisé à l'intérieur des initialiseurs pour les tableaux avec une durée non statique:
§4 Toutes les expressions d'un initialiseur pour un objet qui a une durée de stockage statique ou de threads doivent être des expressions constantes ou des chaînes littérales.
L'un des paragraphes clés est:
§19 L'initialisation doit avoir lieu dans l'ordre de la liste des initialiseurs, chaque initialiseur fourni pour un sous-objet particulier remplaçant tout initialiseur précédemment répertorié pour le même sous-objet; 151)
tous les sous-objets qui ne sont pas initialisés explicitement doivent être initialisés implicitement de la même manière que les objets qui ont une durée de stockage statique.
151) Tout initialiseur pour le sous-objet qui est remplacé et donc non utilisé pour initialiser ce sous-objet peut ne pas être évalué du tout.
Et un autre paragraphe clé est:
§23 Les évaluations des expressions de la liste d'initialisation sont séquencées de manière indéterminée les unes par rapport aux autres et donc l'ordre dans lequel les effets secondaires se produisent n'est pas spécifié. 152)
152) En particulier, l'ordre d'évaluation n'a pas besoin d'être le même que l'ordre d'initialisation des sous-objets.
Je suis assez sûr que le paragraphe §23 indique que la notation dans la question:
int a[5] = { a[2] = 1 };
conduit à un comportement non spécifié. L'affectation à a[2]
est un effet secondaire et l'ordre d'évaluation des expressions est séquencé de manière indéterminée les uns par rapport aux autres. Par conséquent, je ne pense pas qu'il existe un moyen de faire appel à la norme et d'affirmer qu'un compilateur particulier gère cela correctement ou incorrectement.
a[2]=1
évaluée à1
.