ホームページ >バックエンド開発 >C++ >C で最も厄介な解析とは何ですか?また、なぜ `A a(A());` が関数宣言として解釈されるのでしょうか?

C で最も厄介な解析とは何ですか?また、なぜ `A a(A());` が関数宣言として解釈されるのでしょうか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-21 05:40:09901ブラウズ

What is the C   Most Vexing Parse and Why Does It Interpret `A a(A());` as a Function Declaration?

最も厄介な解析: C 構文のパズル

C 構文の迷宮の世界では、1 つの謎めいた難題が際立っています。厄介な解析 (MVP)。この構文の特殊性はプログラマーにとって課題となっており、多くの人が当惑しています。

MVP の核心は、特定の構文のあいまいな解釈にあります。

A a( A() );

この複雑な行は、次のように解釈できます。 2 つの矛盾する方法:

  1. 変数定義: クラス 'A' の変数 'a' が定義され、クラス 'A' の匿名インスタンスを値として受け取ります。
  2. 関数宣言: 関数 'a ' が宣言されており、型 'A' のオブジェクトを返し、名前のない引数を 1 つ取ります。この引数は、'A' を返し、何も取らない関数です。 input.

驚くべきことに、最初の解釈が正しいというプログラマの一般的な期待にもかかわらず、C 標準では 2 番目の解釈が義務付けられています。このため、多くの人が頭を悩ませ、なぜこのような予想外で混乱を招く可能性のある選択が行われたのか疑問に思っています。

MVP の背後にある理論的根拠を理解するために、MVP が存在しなかった仮定のシナリオを考えてみましょう。この別の現実では、関数は C でどのように宣言されるでしょうか?

A foo();

残念ながら、この構文を使用すると、メソッド宣言ではなく変数定義が作成されます。関数宣言に対応するには、新しいキーワードや厄介な構文が必要になります。

そのような複雑さを避けるために、C 標準では、より単純なルールを選択しました。「宣言として解釈できるものはすべて、宣言として解釈される」宣言。"これには、変数定義と関数宣言の両方が含まれます。したがって、構文

A a;

は変数を定義し、

A a();

は関数を宣言します。

このルールを採用すると、構文の一貫性が保証され、特別な場合。これにより、最初はプログラマが混乱するかもしれませんが、最終的には言語の明確さと一貫性が促進されます。

以上がC で最も厄介な解析とは何ですか?また、なぜ `A a(A());` が関数宣言として解釈されるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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