102

sizeof関数ではなく演算子と見なされるのはなぜですか?

オペレーターとしての資格を得るために必要なプロパティは何ですか?

4

10 に答える 10

190

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 が関数になれない理由を示すには十分だと思います。

于 2009-09-08T11:58:06.577 に答える
25

コンパイル時の定数として使用できます。これは、関数ではなく演算子である場合にのみ可能です。例えば:

union foo {
    int i;
    char c[sizeof(int)];
};

関数は型を引数として取ることができないため、構文的に演算子でない場合は、プリプロセッサ マクロである必要があります。sizeof型と変数の両方を引数として取ることができるため、これは実装が難しいマクロです。

于 2009-09-08T12:02:23.913 に答える
6

C標準がそう言っていて、それが唯一の票を獲得するからです。

そして、sizeof型と

一般に、関数の定義域または共定義域 (またはその両方) に実数よりもはるかに複雑な要素が含まれている場合、その関数は演算子と呼ばれます。逆に、関数の定義域も余域も実数よりも複雑な要素を含まない場合、その関数は単に関数と呼ばれる可能性があります。コサインなどの三角関数は後者の例です。

さらに、関数が頻繁に使用され、一般的な F(x,y,z,...) 形式よりも高速または簡単な表記法に進化した場合、結果として得られる特別な形式も演算子と呼ばれます。例としては、加算「+」や除算「/」などの中置演算子、階乗「!」などの後置演算子があります。この使用法は、関連するエンティティの複雑さとは無関係です。

(ウィキペディア)

于 2009-09-08T12:05:49.867 に答える
5

関数ではないからです。次のように使用できます。

int a;
printf("%d\n", sizeof a);

関数にはエントリ ポイント、コードなどがあります。関数は実行時に実行 (またはインライン化) され、sizeof はコンパイル時に決定する必要があります。

于 2009-09-08T12:00:55.510 に答える
2

sizeof 演算子は実行時ではなくコンパイル時のエンティティであり、関数のような括弧は必要ありません。コードがコンパイルされると、コンパイル時に値がその変数のサイズに置き換えられますが、関数が実行された後の関数では、戻り値がわかります。

于 2010-10-27T12:11:30.783 に答える
1

なぜなら:

  • 関数に値を渡す場合、オブジェクトのサイズは関数に渡されないため、sizeof「関数」はサイズを決定する方法がありません
  • C では、関数は 1 種類の引数のみを受け入れることができます。sizeof() は、あらゆる種類の異なるものを受け入れる必要があります (変数と型! C の関数に型を渡すことはできません)
  • 関数の呼び出しには、引数のコピーとその他の不要なオーバーヘッドが含まれます
于 2009-09-08T12:02:39.347 に答える
1

関数とは少し違いがあります - sizeof の値はコンパイル時に解決されますが、実行時には解決されません!

于 2009-09-08T12:02:59.047 に答える
1

これは、オブジェクトのサイズを計算するために、コンパイル時にのみ利用可能な型情報を必要とするコンパイル時の演算子であるためです。これは C++ には当てはまりません。

于 2009-09-08T12:08:23.733 に答える
0

sizeof()演算子はコンパイル時に発生します。パラメータまたは引数を決定するために使用できます。

于 2012-08-06T10:18:52.283 に答える