ホームページ >バックエンド開発 >C++ >関数名が C の Address-of 演算子を含む関数ポインターと同じなのはなぜですか?

関数名が C の Address-of 演算子を含む関数ポインターと同じなのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-15 07:27:02708ブラウズ

Why are Function Names Equivalent to Function Pointers with the Address-of Operator in C?

なぜ関数名は、演算子のアドレスを持つ関数ポインターと同じなのでしょうか?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。