www.mikrocontroller.net

Forum: PC-Programmierung Verständnissfrage zu (++) Inkremntopertor in c++


Autor: anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
 #include "stdafx.h"
#include <iostream>
using namespace std;

void main()
{
  int d=4;
  
  cout << (d++) + (d++) +(d++) << '\n';  //ausgabe 12
  cout << d << '\n';                     //ausgabe 7
}
  
  
Wiso bekomme ich als Ausgabe für d 7 ?
++ ist doch eigentlich inkrementieren!
Die Ausgabe 12 ist logisch da ich ja erst die Ausgabe bekome und dann 
inkrementiert wird aber wiso für d die Ausgabe 7 herauskommt ist mir ein 
Rätsel
Gruß Anfänger

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wiso bekomme ich als Ausgabe für d 7 ?
> ++ ist doch eigentlich inkrementieren!
> Die Ausgabe 12 ist logisch da ich ja erst die Ausgabe bekome und dann
> inkrementiert wird aber wiso für d die Ausgabe 7 herauskommt ist mir ein
> Rätsel
> Gruß Anfänger

vielleicht weil 4+1+1+1 =7 ?

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist der Unterschied zwischen
  cout << (d++) + (d++) + (d++) << '\n';  //ausgabe 12
und
  cout << (d + 1) + (d + 1) + (d + 1) << '\n';  //ausgabe 12

Die erste Form verändert den Wert von d. Andere Schreibweisen
  cout << (d += 1) + (d += 1) + (d += 1) << '\n';  //ausgabe 12
  cout << (d = d + 1) + (d = d + 1) + (d = d + 1) << '\n';  //ausgabe 12

Vielleicht wird das dadurch klarer.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kai Giebeler wrote:

>   cout << (d += 1) + (d += 1) + (d += 1) << '\n';  //ausgabe 12

Nicht äquivalent. Dies inkrementiert vorher, entspricht also ++d. d++ 
jedoch inkrementiert nachher.

Es ist jedoch undefiniert, ob das eine d++ den Wert vor dem 
Inkrementieren der übrigen d++ liefert, oder den Wert nach einem oder 
mehreren davon. Folglich ist das Ergebnis der Zeile undefiniert. Es muss 
keineswegs 12 dabei rauskommen.

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Nicht äquivalent. Dies inkrementiert vorher, entspricht also ++d. d++
>jedoch inkrementiert nachher.

T'schuldigung, zu schnell abgeschickt... hatte mich auf das Ergebnis in 
d konzentriert.

Autor: anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
   #include "stdafx.h"
#include <iostream>
using namespace std;

void main()
{
  int d=4;
  cout << (++c) + (++c)+ (++c)<< '\n';
  cout << c << '\n';
  
cout << (d++) + (d++) +(d++) << '\n';  //ausgabe 12
  cout << d << '\n';                     //ausgabe 7
}
  
 


Sind ist das Beispiele also undefiniert?

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorallem sind die fehlerhaft.

- c?
- '\n' --> endl
- stdafx?!

Ansonsten: Ja, die sind prinzipiell undefiniert, was hier jetzt nicht 
direkt auffällt. Übler und unsauberer Stil.

Autor: TommyS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, es ist nicht undefiniert.

Im ersten Fall
cout << (d++) + (d++) +(d++) << '\n';  //ausgabe 12

wird 4+4+4 (d+d+d) ausgerechnet und ausgegeben, d jeweils danach 
inkrementiert (post-inkrement)

Nach dieser Zeile Programmcode ist somit d dann 4+1+1+1
cout << d << '\n';                     //ausgabe 7

Gibt dann korrekterweise 7 aus.

Viele Grüße,
TommyS

Autor: TommyS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry.

Kleine Verbesserung - damit's keine sprachliche Verwirrung gibt:
d ist nicht undefiniert
c ist undefiniert

Autor: anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja sorry hatte ausversehen den falschen Quelltext reingestellt!

hätte
#include "stdafx.h"
#include <iostream>
using namespace std;


void main()
{
  int d=4;
  
  cout << (d++) + (d++) +(d++) << '\n';  //ausgabe 12
  cout << d << '\n';                     //ausgabe 7
}

heißen sollen!

Ist der folgende dann auch undefiniert?
Weil den hab ich aus einem Lehrbuch Buch!
#include "stdafx.h"
#include <iostream>
using namespace std;

void main()
{
  int a=1, b=2, c=3, d=4;
  cout << ++a << '\n';
  cout << a << '\n';
  cout << b++ << '\n';
  cout << b << '\n';
  // Klammern sind nur zur Verdeutlichung
  cout << (++c) + (++c) << '\n';
  cout << c << '\n';
  // Klammern sind nur zur Verdeutlichung
  cout << (d++) + (d++) << '\n';
  cout << d << '\n';
}


Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TommyS wrote:
> Nein, es ist nicht undefiniert.
Na da würde ich nicht drauf setzen...

http://en.allexperts.com/q/C-1040/Pre-post-increment.htm

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ob
result = (d++) + (d++);
als
result = d + d;
d += 2;
oder als
temp = d;
d += 1;
result = temp + d;
d += 1;
implementiert wird, bleibt dem Compiler überlassen. Analog ist auch bei 
++d statt d++ undefiniert, in welcher Reihenfolge die Teiloperationen 
durchgeführt werden. Erst an sogenannten "sequence points" ist das 
definiert.

Autor: Zeh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die ISO hat das undefinierte Ergebnis sehr wohl definiert und zwar als 
"undefined". Also alles in Budder aufm Kudder.

Autor: anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include "stdafx.h"
#include <iostream>
using namespace std;

void main()
{
  int a=1, b=2, c=3, d=4;
  cout << ++a << '\n';   //Zeile1
  cout << a << '\n';     //Zeile2
  cout << b++ << '\n';   //Zeile3
  cout << b << '\n';     //Zeile4 
  cout << (++c) + (++c) << '\n'; //Zeile5
  cout << c << '\n';             //Zeile6
  cout << (d++) + (d++) << '\n'; //Zeile7
  cout << d << '\n';             //Zeile8
}


also nun nochmals klar und deutlich!
Zeile 1 definiert
Zeile 2 definiert
Zeile 3 definiert
Zeile 4 definiert

Und wie sieht es mit den anderen Zeilen nun aus?
Gruß und nochmals danke!

Autor: Zeh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du eine Variable in einer Anweisung mehrfach veränderst ist das 
Ergebnis undefiniert. Wenn du nun in der Anweisung "sequence points" 
verwendest, ist das Ergebnis nach diesen wieder eindeutig/definiert.

Also:

Zeile 5 & 7 undefiniert, da du die Variable in einer Anweisung mehrfach 
ohne sequence points veränderst.


Wie lautet eigentlich die richtige deutsche Übersetzung für "sequence 
points" ?

Autor: Bascomfehler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Punktfolge?
Reihenfolge?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie beides: Der Automat nennt sie "Reihenfolgenpunkte".

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kenns als "Sequenzpunkt"

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.