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