int x = x;
Dies ist „gültig“ in dem Sinne, dass es nicht eine Einschränkung oder Syntaxregel verletzt, so dass keine Kompilierung-Diagnose erforderlich ist. Der Name x
ist innerhalb des Initialisierers sichtbar und bezieht sich auf das deklarierte Objekt. Der Anwendungsbereich ist in N1570 6.2.1 Absatz 7 definiert:
Any other identifier [other than a struct, union, or enum tag, or an enum constant] has scope that begins just after the completion of its declarator.
Die declarator in diesem Fall ist int x
.
Dies ermöglicht Dinge wie:
int x = 10, y = x + 1;
Aber die Erklärung ist das Verhalten nicht definiert, weil der Initialisierer auf ein Objekt verweist, die nicht initialisiert wurde.
Die explizite Anweisung, dass das Verhalten nicht definiert ist, ist in N1570 6.3.2.1 Absatz 2, der die "Umwandlung" eines lvalue (ein Ausdruck, der ein Objekt bezeichnet) mit dem in diesem Objekt gespeicherten Wert beschreibt.
Except when [list of cases that don't apply here], an lvalue that does not have array type is converted to the value stored in the designated object (and is no longer an lvalue); this is called lvalue conversion.
[...]
If the lvalue designates an object of automatic storage duration that could have been declared with the register
storage class (never had its address taken), and that object is uninitialized (not declared with an initializer and no assignment to it has been performed prior to use), the behavior is undefined.
Das betreffende Objekt ist x
, in der Initialisierungsliste verwiesen. Zu diesem Zeitpunkt wurde x
kein Wert zugewiesen, daher hat der Ausdruck ein undefiniertes Verhalten.
In der Praxis erhalten Sie wahrscheinlich eine Kompilierungswarnung, wenn Sie eine ausreichend hohe Warnstufe aktivieren. Die tatsächliche Verhalten Macht das gleiche sein, wie wenn Sie die initializer ausgelassen hatten:
int x;
aber zählen nicht darauf.
In MSVC gibt es "Warnung C4700: nicht initialisierte lokale Variable 'x' used" aus. Bitte aktivieren Sie die Compilerwarnungen, bevor Sie dumme Fragen stellen. –
@WeatherVane: Die Tatsache, dass ein Compiler eine Warnung ausgibt, sagt Ihnen nicht, ob sie gültig ist. –
MSVC Ausgänge zur Laufzeit '-1373317485' Nun, einmal, verschiedene Werte. –