Ich bin gerade auf ein Verhalten gestoßen, das mich überrascht hat:
Beim Schreiben:
%Vor%in einem C / C ++ - Programm (oder noch komplexeren Ausdruck mit der neu erzeugten Variable x) kompiliert mein gcc / g ++ ohne Fehler. Im obigen Fall ist X 1 danach. Beachten Sie, dass durch eine vorherige Deklaration keine Variable x im Gültigkeitsbereich vorhanden ist.
Also würde ich gerne wissen, ob das richtige Verhalten ist (und sogar in einigen Situationen nützlich sein könnte) oder nur eine Parsereigenschaft mit meiner gcc-Version oder gcc im Allgemeinen.
Übrigens: Folgendes funktioniert nicht:
%Vor%Mit dem Ausdruck:
%Vor% Die Variable x
entsteht am Zeichen =
, weshalb Sie sie auf der rechten Seite verwenden können. Mit "kommt ins Dasein", meine ich, dass die Variable existiert, aber dem Initialisierungsteil noch ein Wert zugewiesen werden muss.
Wenn Sie jedoch keine Variable mit statischer Speicherdauer (z. B. außerhalb einer Funktion) initialisieren, ist dies ein undefiniertes Verhalten, da die entstehende x
einen beliebigen Wert hat.
C ++ 03 hat das zu sagen:
Der Deklarationspunkt für einen Namen befindet sich unmittelbar hinter seinem vollständigen Deklarator (Klausel 8) und vor seinem Initialisierer (falls vorhanden) ...
Beispiel:
int x = 12;
{ int x = x; }
Hier wird das zweite x mit einem eigenen (unbestimmten) Wert initialisiert.
In diesem zweiten Fall gibt es ziemlich genau das, was Sie in Ihrer Frage haben.
Es ist nicht undefiniertes Verhalten .
Sie verwenden eine nicht initialisierte Variable - x
. Sie erhalten 1
aus reinem Glück, alles könnte passieren.
Zu Ihrer Information, in MSVS bekomme ich eine Warnung:
Warnung 1 Warnung C4700: nicht initialisierte lokale Variable 'i' benutzt
Auch zur Laufzeit bekomme ich eine Ausnahme, also ist es definitiv nicht sicher.
Im ersten Fall verwenden Sie einfach den Wert an der Stelle im Speicher, an der sich die Variable befindet. In Ihrem Fall scheint dies Null zu sein, aber es kann alles sein. Die Verwendung eines solchen Konstrukts ist ein Rezept für Katastrophen und schwer zu findende Fehler in der Zukunft.
Für den zweiten Fall ist es einfach ein Syntaxfehler. Sie können einen Ausdruck nicht mit einer solchen Variablendeklaration mischen.
Die Variable wird von "=" an definiert, also ist sie gültig und wenn sie global definiert ist, wird sie als Null initialisiert. In diesem Fall ist das definierte Verhalten, in anderen wurde die Variable als solche unintalisiert wird unitialisiert (aber um 1 erhöht).
Beachten Sie, dass es immer noch nicht sehr vernünftiger oder nützlicher Code ist.
Ihr Code hat zwei Möglichkeiten:
x
eine lokale Variable ist, haben Sie ein undefiniertes Verhalten, da Sie den Wert eines Objekts vor Beginn seiner Lebensdauer verwenden. x
eine statische oder Thread-lokale Lebensdauer hat, wird sie auf Null vorinitialisiert und Ihre statische Initialisierung wird zuverlässig auf 1
setzen. Das ist klar definiert. Vielleicht möchten Sie auch meine Antwort lesen, die verwandte Fälle abdeckt, einschließlich Variablen anderer Typen und Variablen, die geschrieben sind zu , bevor die Initialisierung abgeschlossen ist
3.3.1 Deklarationspunkt 1 Der Deklarationspunkt für einen Namen ist unmittelbar nach seinem vollständigen Deklarator (Paragraph 8) und vor seinem Initialisierer (falls vorhanden), außer wie unten angegeben. [Beispiel: int x = 12; { int x = x; } Hier wird das zweite x mit seinem eigenen initialisiert (unbestimmter) Wert. -End-Beispiel]
Das obige besagt so und sollte einen unbestimmten Wert haben, Du hast Glück mit 1.
Tags und Links c c++ undefined-behavior initialization