Verwendung der neu deklarierten Variablen in der Initialisierung (int x = x + 1)?

7

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%     
Ansgar Lampe 22.03.2012, 10:03
quelle

8 Antworten

16

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.

    
paxdiablo 22.03.2012, 10:11
quelle
8

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.

    
Luchian Grigore 22.03.2012 10:07
quelle
5
%Vor%

ist im Grunde

%Vor%

Sie hatten einfach Glück, dass Sie 0 in x haben.

%Vor%

ist jedoch in C ++ auf Parser-Ebene nicht möglich! Der vorherige konnte geparst werden, war aber semantisch falsch. Der zweite kann nicht einmal geparst werden.

    
Shahbaz 22.03.2012 10:09
quelle
3

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.

    
Some programmer dude 22.03.2012 10:09
quelle
3

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.

    
stefaanv 22.03.2012 10:15
quelle
1

Ihr Code hat zwei Möglichkeiten:

  1. Wenn x eine lokale Variable ist, haben Sie ein undefiniertes Verhalten, da Sie den Wert eines Objekts vor Beginn seiner Lebensdauer verwenden.
  2. Wenn 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

    
Ben Voigt 05.06.2014 18:45
quelle
0
  

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.

    
Praveen 22.03.2012 10:36
quelle
-1

Dies ist undefiniertes Verhalten und der Compiler sollte mindestens eine Warnung ausgeben. Versuchen Sie, mit g++ -ansi ... zu kompilieren. Das zweite Beispiel ist nur ein Syntaxfehler.

    
npclaudiu 22.03.2012 10:11
quelle