sizeof
関数ではなく演算子と見なされるのはなぜですか?
オペレーターとしての資格を得るために必要なプロパティは何ですか?
C標準がそう言っていて、それが唯一の票を獲得するからです。
結果として:
sizeof (int)
、オブジェクト式ではなく、括弧で囲まれた型 にすることができます。int a; printf("%d\n", sizeof a);
完全に問題ありません。第一に、型キャスト式の一部として必要であり、第二に sizeof の優先順位が非常に高くsizeof a + b
、 と同じではないためですsizeof (a+b)
。しかし、それらは sizeof の呼び出しの一部ではなく、オペランドの一部です。sizeof a++
ません ( a を変更しません)。関数は、これらすべての点で異なります。関数と単項演算子の間にはおそらく他にも違いがありますが、それが必要な理由があったとしても sizeof が関数になれない理由を示すには十分だと思います。
コンパイル時の定数として使用できます。これは、関数ではなく演算子である場合にのみ可能です。例えば:
union foo {
int i;
char c[sizeof(int)];
};
関数は型を引数として取ることができないため、構文的に演算子でない場合は、プリプロセッサ マクロである必要があります。sizeof
型と変数の両方を引数として取ることができるため、これは実装が難しいマクロです。
C標準がそう言っていて、それが唯一の票を獲得するからです。
そして、sizeof
型と
一般に、関数の定義域または共定義域 (またはその両方) に実数よりもはるかに複雑な要素が含まれている場合、その関数は演算子と呼ばれます。逆に、関数の定義域も余域も実数よりも複雑な要素を含まない場合、その関数は単に関数と呼ばれる可能性があります。コサインなどの三角関数は後者の例です。
さらに、関数が頻繁に使用され、一般的な F(x,y,z,...) 形式よりも高速または簡単な表記法に進化した場合、結果として得られる特別な形式も演算子と呼ばれます。例としては、加算「+」や除算「/」などの中置演算子、階乗「!」などの後置演算子があります。この使用法は、関連するエンティティの複雑さとは無関係です。
関数ではないからです。次のように使用できます。
int a;
printf("%d\n", sizeof a);
関数にはエントリ ポイント、コードなどがあります。関数は実行時に実行 (またはインライン化) され、sizeof はコンパイル時に決定する必要があります。
sizeof 演算子は実行時ではなくコンパイル時のエンティティであり、関数のような括弧は必要ありません。コードがコンパイルされると、コンパイル時に値がその変数のサイズに置き換えられますが、関数が実行された後の関数では、戻り値がわかります。
なぜなら:
sizeof
「関数」はサイズを決定する方法がありません関数とは少し違いがあります - sizeof の値はコンパイル時に解決されますが、実行時には解決されません!
これは、オブジェクトのサイズを計算するために、コンパイル時にのみ利用可能な型情報を必要とするコンパイル時の演算子であるためです。これは C++ には当てはまりません。
sizeof()
演算子はコンパイル時に発生します。パラメータまたは引数を決定するために使用できます。