Heim >Backend-Entwicklung >C++ >Was ist der nervigste C-Parser und warum interpretiert er „A a(A());' als Funktionsdeklaration?

Was ist der nervigste C-Parser und warum interpretiert er „A a(A());' als Funktionsdeklaration?

Barbara Streisand
Barbara StreisandOriginal
2024-12-21 05:40:09901Durchsuche

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

Das irritierendste Parsen: Ein Rätsel in der C-Syntax

In der labyrinthischen Welt der C-Syntax sticht ein rätselhaftes Rätsel hervor: das Most Vexing Parse (MVP). Diese syntaktische Besonderheit stellt Programmierer vor eine Herausforderung und lässt viele verwirrt zurück.

Der Kern des MVP liegt in der mehrdeutigen Interpretation einer bestimmten Syntax:

A a( A() );

Diese verwirrende Zeile kann in interpretiert werden zwei widersprüchliche Möglichkeiten:

  1. Variablendefinition:Eine Variable 'a' der Klasse 'A' wird definiert und nimmt eine anonyme Instanz der Klasse 'A' als Wert.
  2. Funktionsdeklaration: Eine Funktion 'a' wird deklariert, die eine zurückgibt Objekt vom Typ „A“ und akzeptiert ein einzelnes unbenanntes Argument, das eine Funktion ist, die „A“ zurückgibt und keine Eingabe entgegennimmt.

Überraschenderweise, trotz der vorherrschenden Erwartung Während die meisten Programmierer davon ausgehen, dass die erste Interpretation korrekt ist, schreibt der C-Standard die zweite Interpretation vor. Das lässt viele am Kopf kratzen und fragen sich, warum eine solch unerwartete und möglicherweise verwirrende Wahl getroffen wurde.

Um die Gründe für den MVP zu verstehen, betrachten wir ein hypothetisches Szenario, in dem es ihn nicht gab. Wie würde in dieser alternativen Realität eine Funktion in C deklariert werden?

A foo();

Die Verwendung dieser Syntax führt leider zu einer Variablendefinition und nicht zu einer Methodendeklaration. Um Funktionsdeklarationen zu berücksichtigen, wäre ein neues Schlüsselwort oder eine umständliche Syntax erforderlich.

Um solche Komplexitäten zu vermeiden, entschied sich der C-Standard für eine einfachere Regel: „Alles, was als Deklaration interpretiert werden kann, wird als a interpretiert.“ Erklärung." Dies umfasst sowohl Variablendefinitionen als auch Funktionsdeklarationen. Somit definiert die Syntax

A a;

eine Variable, während

A a();

eine Funktion deklariert.

Die Übernahme dieser Regel stellt die Konsistenz der Syntax sicher und macht dies überflüssig Sonderfälle. Während dies Programmierer zunächst verwirren mag, fördert es letztendlich die Klarheit und Konsistenz der Sprache.

Das obige ist der detaillierte Inhalt vonWas ist der nervigste C-Parser und warum interpretiert er „A a(A());' als Funktionsdeklaration?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn