配列の要素数を計算するために、sizeof(TYPE)よりもsizeof(element)を好むのはなぜですか?


15

私は「キングKNのCプログラミング」を読んでいて、次の文を見つけました。

sizeof(a)/sizeof(a[0])を使用して配列内の要素数を計算することについて説明しました。式sizeof(a)/sizeof(t)(tはaの要素の型)も機能しますが、劣った手法と見なされます。

なぜそれが劣った技術と見なされるのですか?


8
プログラマがaの要素のタイプを変更するとどうなるかを考えましたか?tとは異なるサイズの型に。最初の表現は引き続き大丈夫ですが、2番目の表現は壊れます
-gnat

1
@gnat:それを答えにしてください。
マーティンヨーク

回答:


26

sizeof(a)/sizeof(t)タイプを式に明示的にコーディングします。これで、同じ型を使用していることを確認するためのコンパイラサポートなしで、複数の場所で型が指定されました。したがって、配列の基本型を変更し、(完全に分離した)カウント式では変更しない場合、bingo:コードは正常にコンパイルされますが、要素のカウントは間違っています。運がよければプログラムはクラッシュしますが、そうでなければプログラムはほぼ完全に正しく機能しますが、たまに完全に奇妙な動作をします。

sizeof(a)/sizeof(a[0])正しいことが保証され、配列の名前のみが必要です。タイプを変更すれば大丈夫です。配列名を変更すると、コンパイラは文句を言います。考える必要はありません。私たちはそのようなプログラミングが好きです。


まあ、sizeof a/sizeof*aそれは実際には実質的な違いではありませんが、私は本当に好きです。
デデュプリケーター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.