ฉันคิดว่ามาตรฐาน 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 };
นำไปสู่พฤติกรรมที่ไม่ระบุรายละเอียด การมอบหมายให้a[2]
เป็นผลข้างเคียงและลำดับการประเมินของนิพจน์จะเรียงตามลำดับอย่างไม่แน่นอนซึ่งเกี่ยวเนื่องกัน ดังนั้นฉันไม่คิดว่าจะมีวิธีอุทธรณ์มาตรฐานและอ้างว่าคอมไพเลอร์เฉพาะจัดการสิ่งนี้อย่างถูกต้องหรือไม่ถูกต้อง
a[2]=1
1