Почему для расчета количества элементов в массиве предпочитаете sizeof (element), а не sizeof (TYPE)?

15

Я читаю «Программирование на языке King KN» и нашел следующее утверждение:

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

Почему это считается плохой техникой?

Хиггс
источник
8
Вы рассмотрели, что произойдет, если программист изменит тип элементов в? к типу, имеющему другой размер, чем т. Первое выражение все равно будет в порядке, а второе сломается
комнат
1
@gnat: Вы должны сделать это ответ.
Мартин Йорк

Ответы:

26

sizeof(a)/sizeof(t)явно кодирует тип в выражении. Теперь у вас есть тип, указанный в нескольких местах, без поддержки компилятора, чтобы гарантировать, что вы используете тот же тип. Итак, если вы измените базовый тип массива, но не в (полностью отдельном) выражении count, bingo: ваш код будет скомпилирован очень хорошо, но количество элементов будет неправильным. Если вам повезет, ваша программа потерпит крах, но если нет, то она будет работать почти полностью правильно, но время от времени будет вести себя совершенно странно.

sizeof(a)/sizeof(a[0])гарантированно будет правильным, требуя только имя массива. Измените тип, и все в порядке; измените имя массива, и компилятор будет жаловаться. Не нужно думать: нам нравится такое программирование.

Даниэль Гриском
источник
Ну, я действительно предпочитаю sizeof a/sizeof*a, хотя это не очень существенная разница.
Дедупликатор