1. ホーム
  2. c

[解決済み] なぜsizeofは演算子として扱われるのですか?

2023-01-29 21:14:24

疑問点

なぜ sizeof は関数ではなく演算子とみなされるのでしょうか?

演算子として認められるためには、どのような性質が必要ですか?

どのように解決するのですか?

C言語規格がそう言っていて、唯一の票を得るからです。

結果論として

  • sizeofのオペランドは括弧で囲まれた型にすることができます。 sizeof (int) といったオブジェクト式ではなく、括弧で囲まれた型にすることができます。
  • 括弧は不要です。 int a; printf("%d\n", sizeof a); は全く問題ありません。括弧がよく見られるのは、第一に型キャスト式の一部として必要だからであり、第二に sizeof が非常に高い優先度を持つからで、したがって sizeof a + b と同じではありません。 sizeof (a+b) . しかし、それらは sizeof の呼び出しの一部ではなく、オペランドの一部です。
  • sizeofのアドレスは取れません。
  • sizeofのオペランドである式が実行時に評価されない( sizeof a++ は a を変更しません)。
  • sizeofのオペランドである式は、voidや関数型以外の任意の型を持つことができます。実際、それがsizeofのポイントのようなものです。

関数はこれらの点すべてにおいて異なるでしょう。関数と単項演算子の間には他にも違いがあるでしょうが、sizeof が関数であることを望む理由があったとしても、なぜ関数になり得ないのかを示すにはこれで十分だと思います。