Post-Increment-Operator: Unerwartetes Verhalten [Duplikat]

8

Mein Code ist wie folgt:

%Vor%

Angesichts der Art des post-increment würde ich die folgende Ausgabe erwarten:

%Vor%

Mein Argument ist, dass in Zeile 5 x nach dem Inkrement dem Anfangswert zugewiesen werden sollte.

Stattdessen bekomme ich das jedoch:

%Vor%

Wenn ich in die Versammlung eingrabe, sieht das für mich wie eine bewusste Entscheidung aus:

%Vor%

Was ist hier los? Versucht der GCC, mich vor mir selbst zu retten? Ich habe keine Sprachreferenz zur Hand, aber ich hätte gedacht, dass dies die beabsichtigte Semantik durchbricht.

    
danben 19.07.2010, 02:19
quelle

4 Antworten

13

Das Verhalten ist nicht definiert, da es keinen intervenierenden Sequenzpunkt in x = x++ gibt, siehe z.B. die C FAQ .

    
Georg Fritzsche 19.07.2010, 02:25
quelle
4

Es bleibt von der C-Sprache undefiniert, wann genau ein Post / Pre-In / Dekrement auftritt. So sind Aussagen wie x = x++ nicht gut gebildet - vermeide sie.

    
Thanatos 19.07.2010 02:22
quelle
2

Standards beiseite (da dies in Bezug auf den Standard undefiniert ist), ist die Art, wie es lief, so, wie ich es erwartet hätte.

Meine Faustregel ist, dass Sie für eine Zeile mit x++ die Zeichenfolge x++ durch x ersetzen und x += 1 in die folgende Zeile (oder die vorherige Zeile für die Vorinkrementierung) einfügen.

Nach dieser Faustregel würde Ihr Code als

geschrieben werden %Vor%     
Mark Rushakoff 19.07.2010 02:42
quelle
1

Wenn Sie haben:

%Vor%

Was passiert, ist, dass b in a gespeichert wird und nachdem die Zuweisung erfolgt ist, wird b um eins erhöht. Also wenn du es tust:

%Vor%

und vorher x war 10 was passieren wird ist 10 wird in x gespeichert und danach (bevor dein printf fertig ist) wird x um eins auf 11 erhöht. Deshalb wird 11 gedruckt.

    
functional 19.07.2010 02:23
quelle

Tags und Links