Навіщо віддавати перевагу sizeof (елемент) над sizeof (TYPE) для обчислення кількості елементів у масиві?


15

Я читав "C програмування King KN" і знайшов наступне твердження:

Ми обговорювали використання виразу sizeof(a)/sizeof(a[0])для обчислення кількості елементів у масиві. Вираз sizeof(a)/sizeof(t), де t - тип елементів а, також би працював, але це вважається неповноцінною технікою.

Чому це вважається неповноцінною технікою?


8
Ви думали, що буде, якщо програміст змінить тип елементів у? типу, що має різний розмір, ніж t. Перший вираз все ще буде добре, в той час як другий буде перерва
комар

1
@gnat: Ви повинні відповісти на це.
Мартін Йорк

Відповіді:


26

sizeof(a)/sizeof(t)явно кодує тип у виразі. Тепер у вас вказаний тип у кількох місцях, без підтримки компілятора, щоб гарантувати, що ви використовуєте той самий тип. Отже, якщо ви змінили базовий тип масиву, але не в (повністю окремому) виразі підрахунку, бінго: ваш код складеться чудово, але кількість елементів буде неправильним. Якщо вам пощастить, ваша програма вийде з ладу, але якщо ні, то вона буде функціонувати майже повністю коректно, але раз у раз буде вести себе абсолютно химерно.

sizeof(a)/sizeof(a[0])гарантовано є правильним, вимагаючи лише ім'я масиву. Змініть тип і ви все добре; змінити ім'я масиву, і компілятор подасть скаргу. Не потрібно думати: нам подобається таке програмування.


Ну, я дуже вважаю за краще sizeof a/sizeof*a, хоча це не є суттєвою різницею.
Дедуплікатор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.