บางทีฉันอาจไม่ได้มาจากโลกใบนี้ แต่ดูเหมือนว่าฉันต่อไปนี้ควรเป็นข้อผิดพลาดทางไวยากรณ์:
int a[] = {1,2,}; //extra comma in the end
แต่มันไม่ใช่ ฉันรู้สึกประหลาดใจเมื่อรหัสนี้รวบรวม Visual Studio แต่ฉันได้เรียนรู้ที่จะไม่ไว้วางใจ MSVC คอมไพเลอร์เท่าที่ c ++ กฎระเบียบที่เกี่ยวข้องเพื่อให้ผมตรวจสอบมาตรฐานและเป็นที่ได้รับอนุญาตตามมาตรฐานเช่นกัน คุณสามารถดู 8.5.1 สำหรับกฎไวยากรณ์หากคุณไม่เชื่อฉัน
ทำไมถึงได้รับอนุญาต นี่อาจเป็นคำถามที่ไร้ประโยชน์ แต่ฉันต้องการให้คุณเข้าใจว่าทำไมฉันถึงถาม หากเป็นกรณีย่อยของกฎไวยากรณ์ทั่วไปฉันจะเข้าใจ - พวกเขาตัดสินใจที่จะไม่ทำให้ไวยากรณ์ทั่วไปยากขึ้นเพียงเพื่อไม่อนุญาตให้ใช้เครื่องหมายจุลภาคซ้ำซ้อนในตอนท้ายของรายการ initializer แต่ไม่อนุญาตให้ใช้เครื่องหมายจุลภาคเพิ่มเติมอย่างชัดเจน ยกตัวอย่างเช่นมันจะไม่ได้รับอนุญาตให้มีเครื่องหมายจุลภาคซ้ำซ้อนในตอนท้ายของรายการอาร์กิวเมนต์ฟังก์ชั่นการโทร (เมื่อฟังก์ชั่นใช้เวลา...
) ซึ่งเป็นเรื่องปกติ
ดังนั้นอีกครั้งมีเหตุผลใดที่อนุญาตให้ใช้เครื่องหมายจุลภาคซ้ำซ้อนนี้อย่างชัดเจนหรือไม่
for()
ตัวอย่าง) เพิ่มมันจะส่งคำเตือนคอมไพเลอร์
if (x = 1)
ไม่คลุมเครือในไวยากรณ์ แต่มันคลุมเครือมากต่อมนุษย์และทำให้เกิดการเตือน
if
ตัวอย่างของคุณไม่ชัดเจนเช่นกัน ฉันไม่คิดว่า "กำกวม" หมายถึงสิ่งที่คุณคิดว่ามันหมายถึง!
;
เมื่อโทเค็นที่ชัดเจนถัดไปเป็นคำสั่งถัดไป