Mengapa memilih sizeof (elemen) lebih dari sizeof (TYPE) untuk menghitung jumlah elemen dalam array?

15

Saya membaca "pemrograman King KN's C" dan menemukan pernyataan berikut:

Kami membahas menggunakan ekspresi sizeof(a)/sizeof(a[0])untuk menghitung jumlah elemen dalam array. Ungkapan sizeof(a)/sizeof(t), di mana t adalah jenis elemen a, juga akan berfungsi, tetapi dianggap sebagai teknik yang lebih rendah.

Mengapa itu dianggap teknik yang lebih rendah?

Higgs
sumber
8
apakah Anda mempertimbangkan apa yang akan terjadi jika programmer mengubah jenis elemen dalam? untuk jenis yang memiliki ukuran berbeda dari t. Ekspresi pertama masih akan baik-baik saja, sedangkan yang kedua akan pecah
nyamuk
1
@gnat: Anda harus menjawabnya.
Martin York

Jawaban:

26

sizeof(a)/sizeof(t)secara eksplisit kode tipe ke dalam ekspresi. Anda sekarang memiliki jenis yang ditentukan di beberapa lokasi, tanpa dukungan penyusun untuk memastikan bahwa Anda menggunakan jenis yang sama. Jadi, jika Anda mengubah tipe dasar array, tetapi tidak dalam ekspresi jumlah (sepenuhnya terpisah), bingo: kode Anda akan mengkompilasi dengan baik, tetapi jumlah elemen Anda akan salah. Jika Anda beruntung program Anda akan macet, tetapi jika tidak, ia akan berfungsi hampir sepenuhnya dengan benar, tetapi sesekali akan berperilaku sangat aneh.

sizeof(a)/sizeof(a[0])dijamin benar, hanya membutuhkan nama array. Ubah jenisnya dan Anda baik-baik saja; ganti nama array dan kompiler akan mengeluh. Tidak perlu berpikir: kami menyukai pemrograman seperti itu.

Daniel Griscom
sumber
Yah, saya benar-benar lebih suka sizeof a/sizeof*a, meskipun itu tidak benar-benar perbedaan yang substansial.
Deduplikator