Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
C++ Inkrement und Dekrement
- Ersteller kiwi258
- Erstellt am
S
Suchu
Gast
-- = Dekrement
Zuletzt bearbeitet:
Aroy
Cadet 3rd Year
- Registriert
- Okt. 2007
- Beiträge
- 60
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!?
warum da 4 raus kommt kann ich gerade auch nur raten. und zwar nimmt er einfach das letzte statement.
also ++3 = 4.
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.
return k++, ++m;
also ++3 = 4.
RobaL
Lieutenant
- Registriert
- Apr. 2008
- Beiträge
- 598
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.
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.
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.
Code:
std::vector<int> v;
...
for(int i = 0, i_end=v.size(); i != i_end; ++i) {
...
}
Die Semantik des Komma-OPerators ist, das die Ausdrücke von Links nach Rechts ausgewertet werden und der rechtsaussen stehende Ausdruck den Wert bestimmt.
Yuuri
Fleet Admiral
- Registriert
- Okt. 2010
- Beiträge
- 13.923
Und wo hakt es dann? Mach doch mal nen Schreibtischtest. Nur mal veranschaulicht:
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:
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
Mal weiter suchen...
edit 2: Komma im Return: http://stackoverflow.com/questions/2539458/c-return-x-y-what-is-the-point
C-FAQ:
Also so wie ich das verstanden habe, wäre folgendes Szenario möglich:
Allerdings ungetestet. Würde es allerdings als schlechten Stil beschreiben, auch wenn es vielleicht nützlich sein mag in manchen Situationen.
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
@ 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 ) { /* ... */ }
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;
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
Zuletzt bearbeitet:
antred
Lt. Commander
- Registriert
- Juni 2010
- Beiträge
- 1.288
Das Rätsel habt ihr ja nun schon gelöst.
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.
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.
RobaL
Lieutenant
- Registriert
- Apr. 2008
- Beiträge
- 598
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
@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
antred
Lt. Commander
- Registriert
- Juni 2010
- Beiträge
- 1.288
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?
antred
Lt. Commander
- Registriert
- Juni 2010
- Beiträge
- 1.288
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.
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;
}
Ähnliche Themen
- Antworten
- 5
- Aufrufe
- 1.315
- Antworten
- 15
- Aufrufe
- 882
- Antworten
- 1
- Aufrufe
- 313
- Antworten
- 6
- Aufrufe
- 776