なぜ関数名は、演算子のアドレスを持つ関数ポインターと同じなのでしょうか?
C プログラミングでは、関数名を関数ポインターとして使用します。これは、アドレス演算子 (&) を関数名に適用することと同じです。配列などの他の言語要素とのこの一見矛盾には、特定の根拠があります。
関数名の等価性の理論的根拠
ANSI C90 理論的文書によると、等価性は利便性を高めるために、関数指定子 (関数名) と関数ポインターの間が導入されました。両方の表記を許可することにより、この言語はパッケージ化された構造内のメンバー関数を呼び出すための簡略的な方法を提供します。例:
graphics.open(file) // Equivalent to (*graphics.open)(file)
関数指定子の不思議
この等価性は、独特だが有効な構文形式につながります:
( &f)(); f(); (*f)(); (**f)(); (***f)(); pf(); (*pf)(); (**pf)(); (***pf)();
委員会は次のように推論しました。 a (int a[] の場合) を許可しながら (f)() のような形式を禁止するのは不必要かつ不便です。
パラメータと戻り値の型の例外
興味深いことに、関数型はパラメータとしてそれ自体へのポインタに暗黙的に変換できます (例: void g(FunctionType))。ただし、戻り値の型 (FunctionType h(); など) として使用する場合は、ポインターに変換できません。この区別により、関数の型の互換性の問題が確実に回避されます。
以上が関数名が C の Address-of 演算子を含む関数ポインターと同じなのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。