ทำไม sizeof (my_arr) [0] จึงคอมไพล์และเท่ากับ sizeof (my_arr [0])
ทำไมโค้ดนี้จึงคอมไพล์ _Static uint32_t my_arr[2]; _Static_assert(sizeof(my_arr) == 8, ""); _Static_assert(sizeof(my_arr[0]) == 4, ""); _Static_assert(sizeof(my_arr)[0] == 4, ""); การยืนยัน 2 รายการแรกนั้นถูกต้อง แต่ฉันคาดว่าบรรทัดสุดท้ายจะล้มเหลวเนื่องจากความเข้าใจของฉันคือsizeof()ควรประเมินเป็นลิเทอรัลจำนวนเต็มซึ่งไม่สามารถถือเป็นอาร์เรย์ได้ กล่าวอีกนัยหนึ่งมันจะล้มเหลวในลักษณะเดียวกับที่บรรทัดต่อไปนี้ล้มเหลว: _Static_assert(4[0] == 4, ""); ที่น่าสนใจสิ่งต่อไปนี้ไม่สามารถรวบรวมได้อย่างแท้จริง (ซึ่งควรทำในสิ่งเดียวกันไม่ใช่หรือ): _Static_assert(*sizeof(my_arr) == 4, ""); ข้อผิดพลาด: อาร์กิวเมนต์ประเภทที่ไม่ถูกต้องของ unary '*' (have 'long unsigned int') _Static_assert (* sizeof (my_arr) == 4, ""); ถ้าเป็นเรื่องสำคัญฉันใช้ gcc 5.3.0