Frage

Ich bin auf dieses seltsame C ++ - Programm gestoßen.

#include <iostream>
using namespace std;
int main()
{
  int a = ({int x; cin >> x; x;});
  cout << a;
}

Kann jemand erklären, was los ist? Wie heißt dieses Konstrukt?

War es hilfreich?

Lösung

Es weist den Benutzereingabewert zugewiesen zu a und druckt es aus. Es geschieht mit a Statement Expression.

Aussagen sind Ausdruck GNU GCC Compiler -Erweiterung werden nicht durch die C/C ++ - Standards unterstützt. Daher ist jeder Code, der den Ausdruck der Anweisung verwendet, nicht standardmäßig konform und nicht tragbar.

Das IBM IBM XL C/C ++ V7.0 unterstützt auch Ausdrücke aus und es ist doccumentation sie treffend erklärt:

Ausdruck: Ausdrücke:

Eine zusammengesetzte Aussage ist eine Abfolge von Aussagen, die durch Zahnspangen eingeschlossen sind. In Gnu C kann eine zusammengesetzte Aussage innerhalb von Klammern als Ausdruck in einem sogenannten als a erscheinen Statement expression.

         .--------------.
         V              |
>>-(--{----statement--;-+--}--)--------------------------------><

Der Wert eines Ausdrucksausdrucks ist der Wert des letzten einfachen Ausdrucks im gesamten Konstrukt. Wenn die letzte Aussage kein Ausdruck ist, ist das Konstrukt vom Typ Typ und hat keinen Wert.

Kompilieren Sie Ihren Code immer, indem Sie einen Sandard in GCC auswählen. Verwenden Sie eine der Optionen -ansi, -std=c90 oder -std=iso9899:1990, -std=c++03, -std=c++0x; Um alle vom Standard erforderlichen Diagnose zu erhalten, sollten Sie auch angeben -pedantic (oder -pedantic-errors Wenn Sie möchten, dass sie eher Fehler als Warnungen sind)

Andere Tipps

Es ist eine GCC -Erweiterung. Kompilieren Sie Ihren Code mit dem -pedantic Flagge, wenn du solche Sachen loswerden willst (und du wirklich tun möchte).

Es schafft einen Inline -Bereich, erklärt x In diesem Fall liest es aus der Standardeingabe und die gesamte Aussage bewertet schließlich zu x, was zugewiesen ist a.

Der Komma -Betreiber arbeitet ähnlich, obwohl kein separater Bereich erforderlich ist. Zum Beispiel:

int x;
int a = (cin >> x, x);

würde das gleiche tun. Alle mit Kommas verbundenen Aussagen werden nacheinander ausgeführt, und das Ergebnis des gesamten Ausdrucks wird auf den Wert des operativen Werts des Rechts festgelegt.

Ich glaube nicht, dass dies Standard C ++ ist. Es ist wahrscheinlich eine Compiler-spezifische Erweiterung, die es einem inneren Bereich ermöglicht, einen Wert zu bewerten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top