Programm gibt andere Ergebnisse aus, als erwartet
-
Hallo c-plusplus Community,
ich bin neu hier und werde euch in nächster Zeit mit meinen Fragen nerven.
Ich bin gerade beim C++ lernen und steck jetzt hier fest:int doIt(int a, int& b, int *c) { a *= 3; b += 4; *c += a + b; return a + b + *c; } int main() { int a, b, c; a = b = c = 2; c = doIt(a, b, &a); cout << "a: " << a << " b: " << b << " c: " << c << endl; }Das Programm liefert die Ergebnisse: a: 14 b: 6 c: 26
Meine Frage ist jetzt, wie man auf die Ergebnisse kommt, da ich eigentlich andere Ergebnisse erwartet habe, und zwar a: 2 b: 2 c: 24.
Kann mir das jemand Schritt für Schritt erklären?Danke schon mal im voraus,
Error319
-
Hier ist, was die Funktion genau macht:
int doIt(int a, int& b, int *c) { a *= 3; // doIt::a = 6 (2*3) b += 4; // main::b = 6 (2+4) *c += a + b; // main::a = 2 + 6 + 6 (2 ist der alte Wert, a und b wurden draufaddiert) return a + b + *c; // Rückgabe = 12 + 6 + 6 = 24. Das ist auch der neue Wert von c. }
-
So, mir ist jetzt klar wie man auf c = 26 kommt.
Aber ich versteh nicht wieso sich auch a und b ändern
int doIt(int a, int& b, int *c) { a *= 3; // = 6 b += 4; // = 6 *c += a + b; // = 14 return a + b + *c; // = 6 + 6 + 14 = 26 -> c }
-
b wird als Refernez übergeben. (beachte das & bei b in der Paramterliste von doIt)
Damit hat die Funktion Zugriff auf die entsprechende Variable der aufrufenden Funktion.
-
Aber ich versteh nicht wieso sich auch a und b ändern
Weil die Funktion eine Referenz bzw. einen Zeiger auf a und b haben. Über diese können sie die Variablen ändern.
Kennst du diese Sprachmittel eigentlich?
-
Und schau mal genau hin. Beim Aufruf von
doItist c nicht dabei.
-
Ja aber die Funktion wird doch nur bei c angewendet, d.h. doch, dass a und b sich nicht verändern, also a = 2 und b = 2, oder nicht?
Anders kann ich es mir nur so erklären, dass die Werte von a und b in der Funktion verändert werden, aber dann müsste a = 6 und b = 6 rauskommen.
b würde dann stimmen, aber bei a kommt ja 14 raus, woher kommt die 14? Die 14 kommt nur bei*c += a + bvor, aber das hat ja nichts mit a zu tun.
Oder ist mein Gedankengang einfach nur Käse?

-
DirkB schrieb:
Und schau mal genau hin. Beim Aufruf von
doItist c nicht dabei.Ahhhh, jetzt hab ichs verstanden

Danke
-
Error319 schrieb:
Oder ist mein Gedankengang einfach nur Käse?

ja, verwirrt durch die doppelte Verwendung von Bezeichnern.
int doIt(int x, int& y, int *z) { x *= 3; y += 4; *z += x + y; return x + y + *z; } int main() { int a, b, c; a = b = c = 2; c = doIt(a, b, &a); cout << "a: " << a << " b: " << b << " c: " << c << endl; }und nochmal darüber nachdenken.
-
Oder gleich explizit:
int doIt(int a_copied, int& b_ref, int *a_ptr) { a_copied *= 3; b_ref += 4; *a_ptr += a_copied + b_ref; return a_copied + b_ref + *a_ptr; } int main() { int a, b, c; a = b = c = 2; c = doIt(a, b, &a); cout << "a: " << a << " b: " << b << " c: " << c << endl; }
-
Ist echt einfacher, dankeschön
