C++ Inkrement und Dekrement

kiwi258

Newbie
Registriert
Apr. 2011
Beiträge
3
Hallo, ich habe eine Frage zu folgendem bsp...

int f (ink k, int m){
return k++, ++m;
}

int main ()
{
int k=5, m=3;

cout <<f (k,m);


wieso kommt da 4 heraus...könnte mir das vl jemand kurz erklären?
 
ich bin zwar kein experte in C++ aber seit wann kann man zwei variablen als return statement angeben wenn die funktion nur einen rückgabe wert hat!?

int f (ink k, int m)

warum da 4 raus kommt kann ich gerade auch nur raten. und zwar nimmt er einfach das letzte statement.


also ++3 = 4.
 
Der Unterschied ist, wo du das ++ platzierst.

Prefix: ++x (--x) erhöht (vermindert) zunächst den Wert von x um 1 und liefert dann den neuen Wert von x als Resultat.

Suffix: x++ (x--) liefert zunächst den alten Wert von x als Resultat und erhöht (vermindert) dann den Wert von x um 1.

m wird als zuerst erhöht, dann zurückgeliefert. m++ müsste 3 zurückgeben.

Zu dem return selber kann ich jetzt nichts sagen, müsst mal nachblättern da ich das so noch nie verwendet habe.
 
in C++ ist das Komma auch ein Operator. Ich verwende den Komma-Operator fast nur in Schleifen. Z.B.
Code:
std::vector<int> v;
...
for(int i = 0, i_end=v.size(); i != i_end; ++i) { 
...
}
In der Schleife wird v.size() nur einmalig aufgerufen.
Die Semantik des Komma-OPerators ist, das die Ausdrücke von Links nach Rechts ausgewertet werden und der rechtsaussen stehende Ausdruck den Wert bestimmt.
 
Ja, die Unterschiede sind mir auch klar, ich komm leider trotzdem nicht aufs Ergebnis.
:(

Danke trotzdem
 
Und wo hakt es dann? Mach doch mal nen Schreibtischtest. Nur mal veranschaulicht:
Code:
int f (ink k, int m){
// m ist hier 3
return k++, ++m; // k wird NACH der operation erhöht, also ist k in dieser Operation = 5; m wird VOR der operation erhöht, also ist m hier 4
// "hier wird k = 5" (der Code geht natürlich nicht bis hier hin, da das return davor steht)
}

int main ()
{
int k=5, m=3;

cout <<f (k,m); // k = 5, m = 3; ausgabe: 4
// k = 5, m = 3
Was das mit dem Return aufsich hat, wüsste ich jetzt aber auch nicht.

@ convexus:
Hat mit diesem Thema aber nichts zu tun, du initialisierst oben einfach mehrere Variablen. Gleichbedeutend mit:
Code:
int i = 0, i_end = v.size();
for( ; i != i_end; ++i ) { /* ... */ }
Bei der Rückgabe aber initialisierst du ja aber nichts.

edit: zu dem Komma (auch nur ein wenig abseits dieses Topics): http://stackoverflow.com/questions/1613230/uses-of-c-comma-operator
Code:
int x = some_bool ? printf("WTF"), 5 : fprintf(stderr, "No, really, WTF"), 117;
Mal weiter suchen...

edit 2: Komma im Return: http://stackoverflow.com/questions/2539458/c-return-x-y-what-is-the-point
C-FAQ:
Code:
Precisely stated, the meaning of the comma operator in the general expression

e1 , e2

is "evaluate the subexpression e1, then evaluate e2; the value of the expression is the value of e2." Therefore, e1 had better involve an assignment or an increment ++ or decrement -- or function call or some other kind of side effect, because otherwise it would calculate a value which would be discarded.

Also so wie ich das verstanden habe, wäre folgendes Szenario möglich:
Code:
int a = 4, b = 9;
int c = a++, ++b;
// a wäre jetzt 5
// b wäre hier 10
// c wäre hier 10
Allerdings ungetestet. Würde es allerdings als schlechten Stil beschreiben, auch wenn es vielleicht nützlich sein mag in manchen Situationen.
 
Zuletzt bearbeitet:
Also, ich habe lange nichts mit C++ gemacht, aber return liefert dir nur einen Wert.
Willst du mehrere Rückgaben, benutze Referenzen.
 
Das Rätsel habt ihr ja nun schon gelöst. :)

convexus schrieb:
in C++ ist das Komma auch ein Operator. Ich verwende den Komma-Operator fast nur in Schleifen. Z.B.
Code:
std::vector<int> v;
...
for(int i = 0, i_end=v.size(); i != i_end; ++i) { 
...
}
[...]

Ich würde davon abraten, signed und unsigned Typen in Gleichheitsabfragen zu mischen. std::vector::size() liefert einen std::size_t, also sollte dein Zähler auch vom Typ std::size_t sein. ;)
 
Leute, er will eine Erklärung für sein return und nicht irgendwelche Referenzen, vektoren, richtige for-Schlefien weiß der Teufel was.

@Yuuri: int c = a++, ++b; wird nicht funktionieren, denn du definierst eine Variable mit dem Namen ++b ohne sie zu initialisieren. Allein der Variablenname ist schön ungültig.


Der Schreibtischtest von Yuuri erklärt es, ich schreib es nochmal in anderen Worten. Das k wird hier zwar in deiner Funktion erhöht, hat aber sowieo keinen Einfluss auf das main-Programm, denn die Parameter werden kopiert und nicht als Referenz/Zeiger übergeben. Deine Funktion gibt ++m zurück, also wird m zuerst erhöht und dann zurückgegeben. 3+1=4
 
RobaL schrieb:
Leute, er will eine Erklärung für sein return und nicht irgendwelche Referenzen, vektoren, richtige for-Schlefien weiß der Teufel was.

Ähm, aber Yuuri hat doch bereits alles erklärt.

RobaL schrieb:
@Yuuri: int c = a++, ++b; wird nicht funktionieren, denn du definierst eine Variable mit dem Namen ++b ohne sie zu initialisieren. Allein der Variablenname ist schön ungültig.

Wieso? Schau dir Yuuri's Beispiel noch mal genau an. Noch mal zur Erinnerung:

Code:
int a = 4, b = 9;
int c = a++, ++b;

Wo siehst du da nicht initialisierte Variablen oder ungültige Variablennamen?
 
int c = a++, ++b;

entspricht:

int c = a++;
int ++b;
 
Nee, int c = a++, ++b;

entspricht:

a++;
int c = ++b;

Also noch mal, wo siehst du nicht initialisierte Variablen oder ungültige Variablennamen?


EDIT: Sorry, ich muß dir Recht geben. :( Ich habe wieder mal nicht an die Priorität der Operatoren gedacht. Damit das so funktioniert, wie ich es mir dachte, muß man das ganze so schreiben.

Code:
int a = 4, b = 9;
int c = ( a++, ++b );
 
Zuletzt bearbeitet:
Hey, das macht Spaß! Was wird hier ausgegeben? Erst selbst überlegen, dann compilieren!

Code:
#include <stdio.h>

int funct1 (int param ) {
  return param++,++param;
}

int funct2 (int param ) {
  return (param++,++param);
}

int funct3 (int param ) {
  return ++param,param++;
}

int funct4 (int param ) {
  return (++param,param++);
}

int funct1a (int param ) {
  int f;
  f=param++,++param;
  return f;
}

int funct2a (int param ) {
  int f;
  f=(param++,++param);
  return f;
}

int funct3a (int param ) {
  int f;
  f=++param,param++;
  return f;
}

int funct4a (int param ) {
  int f;
  f=(++param,param++);
  return f;
}


int main(void) {
  int i,j,k,l;
  i=0;
  j=10;
  l=(k=i++,++j);

  printf("%d %d %d %d\n",i,j,k,l);
  printf("%d %d %d %d\n",funct1(0),funct2(0),funct3(0),funct4(0));
  printf("%d %d %d %d\n",funct1a(0),funct2a(0),funct3a(0),funct4a(0));

  return 0;
}
 
Ja dann funktionierts :) Das Komma ist in C++ sowieso verflucht.
 
Zurück
Oben