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 249
    

    Problem:

    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 249
    

    woher 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 249
    

    woher 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);
       }
    

  • Mod

    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.


Anmelden zum Antworten