Verständnissfrage zu (++) Inkremntopertor in c++

Gast #1150483
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
#1150487
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 ?
#1150488
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.
#1150496
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.
Gast #1150587
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?
Gast #1150599
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
Gast #1150608
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
}
#1150618
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.
Gast #1150778
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!
Gast #1150809
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" ?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren