Czytam „Programowanie C króla KN” i znalazłem następującą wypowiedź:
Omówiliśmy użycie wyrażenia
sizeof(a)/sizeof(a[0])
do obliczenia liczby elementów w tablicy. Wyrażeniesizeof(a)/sizeof(t)
, w którym t jest rodzajem elementów a, również by działało, ale jest uważane za gorszą technikę.
Dlaczego jest uważany za gorszą technikę?
Odpowiedzi:
sizeof(a)/sizeof(t)
jawnie koduje typ w wyrażeniu. Teraz masz typ określony w wielu lokalizacjach, bez obsługi kompilatora dla zapewnienia, że używasz tego samego typu. Tak więc, jeśli zmienisz podstawowy typ tablicy, ale nie w (całkowicie oddzielnym) wyrażeniu liczącym, bingo: kod będzie dobrze się kompilował, ale liczba elementów będzie niepoprawna. Jeśli masz szczęście, twój program się zawiesi, ale jeśli nie, będzie działał prawie całkowicie poprawnie, ale co jakiś czas będzie zachowywał się całkowicie dziwnie.sizeof(a)/sizeof(a[0])
gwarantuje poprawność, wymagając jedynie nazwy tablicy. Zmień typ i wszystko w porządku; zmień nazwę tablicy, a kompilator będzie narzekał. Nie wymaga myślenia: lubimy tego rodzaju programowanie.źródło
sizeof a/sizeof*a
, chociaż nie jest to tak naprawdę istotna różnica.