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?
c++
syntax
language-extension
gcc-extensions
Koshimitsu
quelle
quelle
Antworten:
Es weist dem Benutzer einen Eingabewert zu
a
und druckt ihn aus. Dies geschieht mit aStatement 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:
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).quelle
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 ).quelle
Es erstellt einen Inline-Bereich, deklariert
x
darin, liest ihn aus der Standardeingabe und die gesamte Anweisung wird schließlich ausgewertetx
, der zugewiesen ista
.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.
quelle
Ich glaube nicht, dass dies Standard C ++ ist. Es ist wahrscheinlich eine compilerspezifische Erweiterung, die es einem inneren Bereich ermöglicht, einen Wert auszuwerten.
quelle