Bence C11 standardı bu davranışı kapsıyor ve sonucun belirsiz olduğunu söylüyor ve C18'in bu alanda ilgili herhangi bir değişiklik yaptığını düşünmüyorum.
Standart dilin ayrıştırılması kolay değildir. Standardın ilgili bölümü
§6.7.9 Başlatma'dır . Sözdizimi şu şekilde belgelenmiştir:
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
Terimlerden birinin atama ifadesi olduğuna dikkat edin ve a[2] = 1
şüphesiz bir atama ifadesi olduğundan, statik olmayan süreye sahip diziler için başlatıcıların içinde buna izin verilir:
§4 Statik veya iş parçacığı depolama süresi olan bir nesne için başlatıcıdaki tüm ifadeler, sabit ifadeler veya dizgi değişmezleri olmalıdır.
Anahtar paragraflardan biri şudur:
§19 Başlatma, başlatıcı listesi sırasında gerçekleşir, her başlatıcı belirli bir alt nesne için sağlanır ve aynı alt nesne için önceden listelenen başlatıcıları geçersiz kılar; 151)
açıkça başlatılmayan tüm alt nesneler, statik depolama süresi olan nesnelerle aynı şekilde örtülü olarak başlatılacaktır.
151) Alt nesne için geçersiz kılınan ve bu nedenle bu alt nesneyi başlatmak için kullanılmayan herhangi bir başlatıcı hiç değerlendirilmeyebilir.
Ve bir diğer önemli paragraf:
§23 Başlatma listesi ifadelerinin değerlendirmeleri, birbirlerine göre belirsiz bir şekilde sıralanır ve bu nedenle herhangi bir yan etkinin meydana gelme sırası belirtilmemiştir. 152)
152) Özellikle, değerlendirme sırasının, alt nesne başlatma sırası ile aynı olması gerekmez.
Kesinlikle eminim ki §23 paragraf sorudaki gösterimin:
int a[5] = { a[2] = 1 };
belirsiz davranışlara yol açar. Atama a[2]
bir yan etkidir ve ifadelerin değerlendirme sırası birbirine göre belirsiz şekilde sıralanır. Sonuç olarak, standarda başvurmanın ve belirli bir derleyicinin bunu doğru veya yanlış şekilde ele aldığını iddia etmenin bir yolu olduğunu düşünmüyorum.
a[2]=1
değerlendirilir1
.