เหตุใดจึงเลือก sizeof (องค์ประกอบ) มากกว่า sizeof (TYPE) สำหรับการคำนวณจำนวนองค์ประกอบในอาร์เรย์


15

ฉันกำลังอ่าน "การโปรแกรม C ของ King KN" และพบข้อความต่อไปนี้:

เราพูดถึงการใช้นิพจน์sizeof(a)/sizeof(a[0])เพื่อคำนวณจำนวนองค์ประกอบในอาร์เรย์ การแสดงออกsizeof(a)/sizeof(t)ที่ t คือประเภทขององค์ประกอบก็จะทำงานได้เช่นกัน แต่ก็ถือว่าเป็นเทคนิคที่ด้อยกว่า

ทำไมจึงถือว่าเป็นเทคนิคที่ด้อยกว่า


8
คุณได้พิจารณาแล้วว่าจะเกิดอะไรขึ้นหากโปรแกรมเมอร์เปลี่ยนประเภทขององค์ประกอบใน? ประเภทที่มีขนาดแตกต่างจาก t การแสดงออกครั้งแรกจะยังคงโอเคในขณะที่สองจะแตก
ริ้น

1
@gnat: คุณควรตอบคำถามนั้น
Martin York

คำตอบ:


26

sizeof(a)/sizeof(t)รหัสประเภทลงในการแสดงออกอย่างชัดเจน ตอนนี้คุณมีประเภทที่ระบุในหลาย ๆ สถานที่โดยไม่มีการสนับสนุนคอมไพเลอร์เพื่อให้แน่ใจว่าคุณกำลังใช้ประเภทเดียวกัน ดังนั้นถ้าคุณเปลี่ยนประเภทฐานของอาร์เรย์ แต่ไม่ใช่ในนิพจน์นับ (แยกจากกันโดยสิ้นเชิง) bingo: รหัสของคุณจะรวบรวมได้ดี แต่องค์ประกอบของคุณจะผิด หากคุณโชคดีที่โปรแกรมของคุณจะทำงานล้มเหลว แต่ถ้าไม่ใช่โปรแกรมจะทำงานได้อย่างถูกต้องเกือบทั้งหมด แต่ทุกครั้งที่ทำงานจะผิดปกติอย่างสิ้นเชิง

sizeof(a)/sizeof(a[0])มีการรับประกันว่าถูกต้องต้องใช้ชื่อของอาร์เรย์เท่านั้น เปลี่ยนประเภทแล้วคุณก็สบายดี เปลี่ยนชื่ออาร์เรย์และคอมไพเลอร์จะบ่น ไม่ต้องคิดอะไรเราชอบโปรแกรมประเภทนั้น


ฉันชอบsizeof a/sizeof*aมากแม้ว่ามันจะไม่แตกต่างกันมากนัก
Deduplicator
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.