回答:
C標準がそう言っているので、それが唯一の票を得ます。
結果として:
sizeof (int)
、オブジェクト式ではなく、括弧で囲まれた型にすることができます。int a; printf("%d\n", sizeof a);
。完全に問題ありません。彼らは、多くの場合、それらは型キャスト式の一部として必要に応じて、およびsizeofが非常に高い優先順位を持つ第二ので、そうしているまずので、見ているsizeof a + b
と同じではありませんsizeof (a+b)
。しかし、それらはsizeofの呼び出しの一部ではなく、オペランドの一部です。sizeof a++
ません(aを変更しません)。関数は、これらすべての点で異なります。関数と単項演算子の間にはおそらく他の違いがありますが、私はそれがありたい理由があったとしてもsizeofが関数になり得なかった理由を示すのに十分だと思います。
sizeof
、式にVLAが含まれている場合でも副作用を許可します。
sizeof
:sizeof unary-expression
との2つの表記法を使用しています。sizeof ( type-name )
そのため、C11標準では、「キャスト」ではなく括弧で囲まれた型名と見なされます。最終結果はほとんど同じです。(比較として、キャスト式は( type-name ) cast-expression
です。)そして、コメントのMarkdownがQ&A Markdownとは異なる動作をするのが嫌いです。
コンパイル時の定数として使用できます。これは、関数ではなく演算子である場合にのみ可能です。例えば:
union foo {
int i;
char c[sizeof(int)];
};
構文的には、それが演算子ではない場合、関数は引数として型を受け取ることができないため、それはプリプロセッサマクロでなければなりません。sizeof
型と変数の両方を引数として取ることができるため、実装するのが難しいマクロです。
C標準がそう言っているので、それが唯一の票を得ます。
そして、sizeof
タイプを取り、
一般に、関数のドメインまたはコドメイン(あるいはその両方)に実数よりもかなり複雑な要素が含まれている場合、その関数は演算子と呼ばれます。逆に、関数のドメインにもコドメインにも実数よりも複雑な要素が含まれていない場合、その関数は単に関数と呼ばれる可能性があります。コサインのような三角関数は後者の例です。
さらに、関数が頻繁に使用されて、一般的なF(x、y、z、...)形式よりも高速または簡単な表記法に進化した場合、結果の特殊な形式も演算子と呼ばれます。例には、加算 "+"や除算 "/"などのインフィックス演算子や、階乗 "!"などのポストフィックス演算子が含まれます。この使用法は、関係するエンティティの複雑さとは無関係です。
sizeof演算子は、ランタイムではなくコンパイル時のエンティティであり、関数のように括弧は必要ありません。コードがコンパイルされると、コンパイル時に値がその変数のサイズに置き換えられますが、関数が実行された後の関数では、戻り値がわかります。
Sizeof()、明らかに関数と演算子の両方だと思います。どうして?関数は、エントリの段階でエントリの括弧を保持するためです。ただし、主に演算子原因演算子もアクション文字であるため、sizeofは括弧内のオペランドに作用するアクションステートメントです。