Parameterweitergabe und Erhöhung
-
Hallo Community,
ich habe wieder ein winziges Problem.
#include <iostream> using namespace std; int a=0, b=1; int f1(int a); int f2(int b); int main() { int count; for (count=1;count<=5;++count) { b+=f1(a+1)+1; cout << b << " "; } } int f1(int a) { b = f2(a+1)+1; return (b); } int f2(int a) { return (b+a); }Ausgabe :
9 25 57 121 249Problem:
b+=f1(a+1)+1; cout << b << " ";Parameter a wird an die Funktion f1 übergeben und um 1 erhöht richtig ?
int f1(int a) { b = f2(a+1)+1; return (b); }f1 erwartet ein Parameter und erhält das vorher um 1 erhöhte a. Nun gibt er das weiter an f2 und wird noch einmal erhöht um 1.
int f2(int a) { return (b+a); }f2 erwartet und empfängt das a und addiert es mit b. Die Variable b ist 1 somit gibt f2 an f1 beim ersten durchlauf 3 weiter.
Nach dem ersten kompletten Durchlauf der Schleife hat b den Wert 9. Was ich jetzt wissen muss, beim zweiten (dritten..usw) Druchlauf welchen Wert haben a und b in f1 und f2 ? Die sind ja nicht immer gleich. Behalten diese die Werte vom letzten Durchlauf ?
Oder anders formuliert:
Ausgabe :
9 25 57 121 249woher kommt genau die Differenz zwischen der ersten Ausgabe 9 und 25 ?
-
vatan89 schrieb:
Problem:
b+=f1(a+1)+1; cout << b << " ";Parameter a wird an die Funktion f1 übergeben und um 1 erhöht richtig ?
Richtig, das Ergebnis der Addition wird übergeben.
vatan89 schrieb:
Ausgabe :
9 25 57 121 249woher kommt genau die Differenz zwischen der ersten Ausgabe 9 und 25 ?
In f1 wird b bereits verändert, anschließend zurückgegeben und in der Schleife wieder mit sich und 1 addiert.
Lösen wir f2 mal auf:int f1(int a){ b += 3; return b; }Da a sich nicht ändert, kann es durch 2 ersetzt werden.
Und nun f1 in der Schleife:b+=3; b+=b+1;Jetzt rechne mal nach.
#include <iostream> using namespace std; int b=1; int main(){ for (int count=1;count<=5;++count){ b+=3; b+=b+1; cout << b << " "; } }
-
Ok, ich glaube ich habe es verstanden, zumindest komme ich auf die weiteren zahlen der Ausgabe.
Aber weshalb wird aus
int f1(int a) { b = f2(a+1)+1; return (b); }dieser Ausdruck
int f1(int a){ b += 3; return b;Wie bist du darauf gekommen, f1 in dieser Form zu ändern.
weil in meiner Überlegung bin ich davon ausgengangen, dass a bei der weitergabe aus der Schleife um eins erhöht, und bei der weiteren weitergabe in f1 zu f2 noch einmal um 1 erhöhoht wird und
int f2(int a) { return (b+a); // also sprich return (1+2)habe ich gedacht dann }int f1(int a) { b = f2(a+1)+1; //wäre hier b=3+1...aber das war dann wohl gänzlich daneben return (b); }
-
a+1 ist der Wert, der um 1 größer ist als a. Aber a selber ändert sich nicht.
-
Dein globales a ändert sich nie, es bleibt immer 0, daher wird beim Aufruf von f1 immer 1 übergeben und schlussfolgernd f2 immer 2.
Damit kommt der Aufruf von f2 dem Ausdruck b+2 gleich und...
b = b+2+1;...konnte vereinfacht werden zu...
b += 3;Der Aufruf von f1 konnte durch den Rückgabewert b ersetzt werden, jedoch musste noch die vorherige Addition zu b vorangestellt werden.
-
Alles klar danke, jetzt ist es sogar für mich nachvollziehbar.