ホームページ > バックエンド開発 > C++ > C の「最も厄介な解析」とは何ですか?また、それがどのように関数宣言を誤解させるのでしょうか?

C の「最も厄介な解析」とは何ですか?また、それがどのように関数宣言を誤解させるのでしょうか?

Barbara Streisand
リリース: 2024-11-24 13:22:12
オリジナル
499 人が閲覧しました

What's C  's

C の最も厄介な解析

C では、コード スニペットの解析方法により、予期しない動作が発生する可能性があります。悪名高い例の 1 つは、「最も厄介な解析」として知られています。

関数宣言の謎

次のコードを考えてみましょう:

widget w(gadget(), doodad());
ログイン後にコピー

一見すると、ウィジェット型の w という名前の変数を宣言しているように見えます。ただし、このコードは実際には、2 つの引数を取る w という名前の関数を定義しています。

引数の減衰とポインター キャスト

関数宣言では、配列型の引数はポインターに減衰します。最初の要素に追加され、関数型の引数が関数ポインターに分解されます。したがって、w の同等の宣言は次のようになります。

widget w(gadget(*)(), doodad(*)());
ログイン後にコピー

これは、関数 w が最初の引数として、引数をとらずガジェットを返す関数へのポインターを取ることを意味します。また、2 番目の引数、つまり引数をとらずに doodad を返す関数へのポインタも受け取ります。関数自体はウィジェットを返します。

追加の複雑さ

「最も厄介な解析」は、次のような場合にはさらに複雑になります:

widget w(gadget(x));
ログイン後にコピー

x がすでに変数である場合、これを関数宣言としてどのように解釈できますか?その答えは、 C では変数を宣言するときに追加の括弧を使用できるという事実にあります。したがって、ガジェット x;およびガジェット (x);どちらも x という名前の同じ変数を宣言します。したがって、上記のコードは、x という名前のガジェット型の最初の引数を受け取り、ウィジェットを返す関数の宣言です。

以上がC の「最も厄介な解析」とは何ですか?また、それがどのように関数宣言を誤解させるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート