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


von anfänger (Gast)


Lesenswert?

1
 #include "stdafx.h"
2
#include <iostream>
3
using namespace std;
4
5
void main()
6
{
7
  int d=4;
8
  
9
  cout << (d++) + (d++) +(d++) << '\n';  //ausgabe 12
10
  cout << d << '\n';                     //ausgabe 7
11
}
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

von Justus S. (jussa)


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 ?

von Kai G. (runtimeterror)


Lesenswert?

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

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

Vielleicht wird das dadurch klarer.

von (prx) A. K. (prx)


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.

von Kai G. (runtimeterror)


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.

von anfänger (Gast)


Lesenswert?

1
   #include "stdafx.h"
2
#include <iostream>
3
using namespace std;
4
5
void main()
6
{
7
  int d=4;
8
  cout << (++c) + (++c)+ (++c)<< '\n';
9
  cout << c << '\n';
10
  
11
cout << (d++) + (d++) +(d++) << '\n';  //ausgabe 12
12
  cout << d << '\n';                     //ausgabe 7
13
}


Sind ist das Beispiele also undefiniert?

von Sven P. (Gast)


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.

von TommyS (Gast)


Lesenswert?

Nein, es ist nicht undefiniert.

Im ersten Fall
1
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
1
cout << d << '\n';                     //ausgabe 7

Gibt dann korrekterweise 7 aus.

Viele Grüße,
TommyS

von TommyS (Gast)


Lesenswert?

Sorry.

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

von anfänger (Gast)


Lesenswert?

ja sorry hatte ausversehen den falschen Quelltext reingestellt!

hätte
1
#include "stdafx.h"
2
#include <iostream>
3
using namespace std;
4
5
6
void main()
7
{
8
  int d=4;
9
  
10
  cout << (d++) + (d++) +(d++) << '\n';  //ausgabe 12
11
  cout << d << '\n';                     //ausgabe 7
12
}

heißen sollen!

Ist der folgende dann auch undefiniert?
Weil den hab ich aus einem Lehrbuch Buch!
1
#include "stdafx.h"
2
#include <iostream>
3
using namespace std;
4
5
void main()
6
{
7
  int a=1, b=2, c=3, d=4;
8
  cout << ++a << '\n';
9
  cout << a << '\n';
10
  cout << b++ << '\n';
11
  cout << b << '\n';
12
  // Klammern sind nur zur Verdeutlichung
13
  cout << (++c) + (++c) << '\n';
14
  cout << c << '\n';
15
  // Klammern sind nur zur Verdeutlichung
16
  cout << (d++) + (d++) << '\n';
17
  cout << d << '\n';
18
}

von Sven P. (Gast)


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

von (prx) A. K. (prx)


Lesenswert?

Ob
1
result = (d++) + (d++);
als
1
result = d + d;
2
d += 2;
oder als
1
temp = d;
2
d += 1;
3
result = temp + d;
4
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.

von Zeh (Gast)


Lesenswert?

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

von anfänger (Gast)


Lesenswert?

1
#include "stdafx.h"
2
#include <iostream>
3
using namespace std;
4
5
void main()
6
{
7
  int a=1, b=2, c=3, d=4;
8
  cout << ++a << '\n';   //Zeile1
9
  cout << a << '\n';     //Zeile2
10
  cout << b++ << '\n';   //Zeile3
11
  cout << b << '\n';     //Zeile4 
12
  cout << (++c) + (++c) << '\n'; //Zeile5
13
  cout << c << '\n';             //Zeile6
14
  cout << (d++) + (d++) << '\n'; //Zeile7
15
  cout << d << '\n';             //Zeile8
16
}


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!

von Zeh (Gast)


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" ?

von Bascomfehler (Gast)


Lesenswert?

Punktfolge?
Reihenfolge?

von (prx) A. K. (prx)


Lesenswert?

Irgendwie beides: Der Automat nennt sie "Reihenfolgenpunkte".

von Karl H. (kbuchegg)


Lesenswert?

Ich kenns als "Sequenzpunkt"

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.