Ich denke, der C11-Standard deckt dieses Verhalten ab und sagt, dass das Ergebnis nicht spezifiziert ist , und ich denke, dass C18 keine relevanten Änderungen in diesem Bereich vorgenommen hat.
Die Standardsprache ist nicht einfach zu analysieren. Der relevante Abschnitt der Norm ist
§6.7.9 Initialisierung . Die Syntax ist dokumentiert als:
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
Beachten Sie, dass einer der Begriffe Zuweisungsausdruck ist. Da a[2] = 1
es sich zweifellos um einen Zuweisungsausdruck handelt, ist er in Initialisierern für Arrays mit nicht statischer Dauer zulässig:
§4 Alle Ausdrücke in einem Initialisierer für ein Objekt mit statischer oder Thread-Speicherdauer müssen konstante Ausdrücke oder Zeichenfolgenliterale sein.
Einer der wichtigsten Absätze ist:
§19 Die Initialisierung erfolgt in der Reihenfolge der Initialisiererliste, wobei jeder Initialisierer für ein bestimmtes Unterobjekt vorgesehen ist und alle zuvor aufgelisteten Initialisierer für dasselbe Unterobjekt überschreibt. 151)
Alle Unterobjekte, die nicht explizit initialisiert werden, müssen implizit genauso initialisiert werden wie Objekte mit statischer Speicherdauer.
151) Ein Initialisierer für das Unterobjekt, der überschrieben wird und daher nicht zum Initialisieren dieses Unterobjekts verwendet wird, wird möglicherweise überhaupt nicht ausgewertet.
Und ein weiterer wichtiger Absatz ist:
§23 Die Auswertungen der Initialisierungslistenausdrücke sind unbestimmt aufeinander bezogen und daher ist die Reihenfolge, in der Nebenwirkungen auftreten, nicht spezifiziert. 152)
152) Insbesondere muss die Auswertungsreihenfolge nicht mit der Reihenfolge der Unterobjektinitialisierung übereinstimmen.
Ich bin mir ziemlich sicher, dass Absatz 23 die Notation in der Frage angibt:
int a[5] = { a[2] = 1 };
führt zu nicht näher bezeichnetem Verhalten. Die Zuordnung zu a[2]
ist ein Nebeneffekt, und die Bewertungsreihenfolge der Ausdrücke ist unbestimmt in Bezug zueinander geordnet. Folglich glaube ich nicht, dass es eine Möglichkeit gibt, sich auf den Standard zu berufen und zu behaupten, dass ein bestimmter Compiler dies richtig oder falsch handhabt.
a[2]=1
ergibt1
.