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?
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?
Antworten:
Es weist dem Benutzer einen Eingabewert zu a
und druckt ihn aus. Dies geschieht mit a Statement Expression
.
Anweisungsausdrücke sind gnu gcc Compiler-Erweiterungen werden von den C / C ++ - Standards nicht unterstützt. Daher ist jeder Code, der einen Anweisungsausdruck verwendet, nicht standardkonform und nicht portierbar.
IBM IBM XL C / C ++ v7.0 unterstützt auch Anweisungsausdrücke und die Dokumentation erklärt sie treffend:
Anweisungsausdrücke:
Eine zusammengesetzte Anweisung ist eine Folge von Anweisungen, die in geschweifte Klammern eingeschlossen sind. In GNU C kann eine zusammengesetzte Anweisung in Klammern als Ausdruck in a erscheinen
Statement expression
.
.--------------.
V |
>>-(--{----statement--;-+--}--)--------------------------------><
Der Wert eines Anweisungsausdrucks ist der Wert des letzten einfachen Ausdrucks, der im gesamten Konstrukt angezeigt wird. Wenn die letzte Anweisung kein Ausdruck ist, ist das Konstrukt vom Typ void und hat keinen Wert.
Immer Kompilieren des Codes durch einen sandard in GCC Auswahl, verwenden Sie eine der Optionen -ansi
, -std=c90
oder -std=iso9899:1990
, -std=c++03
, -std=c++0x
; Um alle vom Standard geforderten Diagnosen zu erhalten, sollten Sie auch angeben -pedantic
(oder -pedantic-errors
ob Sie möchten, dass es sich eher um Fehler als um Warnungen handelt).
Es ist eine GCC-Erweiterung. Kompilieren Sie Ihren Code mit dem -pedantic
Flag, wenn Sie solche Dinge loswerden möchten (und das möchten Sie wirklich ).
Es erstellt einen Inline-Bereich, deklariert x
darin, liest ihn aus der Standardeingabe und die gesamte Anweisung wird schließlich ausgewertet x
, der zugewiesen ist a
.
Der Komma-Operator funktioniert ähnlich, benötigt jedoch keinen separaten Bereich. Zum Beispiel:
int x;
int a = (cin >> x, x);
würde das gleiche tun. Alle mit Kommas verbundenen Anweisungen werden nacheinander ausgeführt, und das Ergebnis des gesamten Ausdrucks wird auf den Wert des Operanden ganz rechts gesetzt.
Ich glaube nicht, dass dies Standard C ++ ist. Es ist wahrscheinlich eine compilerspezifische Erweiterung, die es einem inneren Bereich ermöglicht, einen Wert auszuwerten.