Verständnisfrage zu Funktionen bzw. deren Aufruf, Ablauf und Rückgabewerten. [gelöst]



  • Guten Tag und Willkommen,

    ich bin gerade dabei mich in C-Programmierung einzuarbeiten, d.h. kann man mich als absoluten Anfänger deklarieren. Vorherige Programmiererfahrungen habe ich, außer Bash und HTLM, nicht.

    Ich habe mir von Kernighan und Ritchie die zweite Edition besorgt und habe nun ein kleines Verständnisproblem zu einer Lektion.

    #include <stdio.h>
    
    int power (int m, int n);
    
    /* test power function */
    
    int main (void)
    {
            int i;
    
            for (i = 0; i < 10; i++)
                    printf("%d %d\n", i, power (2,i));
            return 0;
    }
    
    /* power: raise base to n-th power; n >= 0 */
    
    int power (int base, int n)
    {
            int i, p;
    
            p = 1;
            for (i = 1; i <= n; i++) {
                    p = p * base;
            }
            return p;
    }
    

    Grundsätzlich verstehe ich was passiert. Die for-Schleife gibt im ersten Durchlauf die Werte 2 und 0 an power weiter. Hier wird nichts berechnet, da in der zweiten for der Wert i größer als n ist.

    Da p auf 1 gesetzt wird, wird dieser Wert an main zurück- und dann ausgegeben.

    Beim zweiten Durchlauf erhält power dann 2 und 1. Die for-Schleife springt an, rechnet 2 * 1 und gibt 2 an main zurück. Soweit so gut.

    Beim dritten Durchlauf gibt power aber den Wert 4 aus, beim vierten 8. p wird innerhalb von power aber doch auf 1 gesetzt. Warum behält p immer den vorherigen, zurückgegebenen Wert bei? Ja eigentlich nur dann, wenn die for-Schleife nicht beendet wird. Aber wird nicht bei jedem Aufruf aus main heraus die Funktion komplett durchlaufen?

    Vielen Dank im voraus für eure Hilfe.



  • MadMarcsen schrieb:

    Warum behält p immer den vorherigen, zurückgegebenen Wert bei?

    p behält nicht den vorherigen Wert bei.

    Ja eigentlich nur dann, wenn die for-Schleife nicht beendet wird. Aber wird nicht bei jedem Aufruf aus main heraus die Funktion komplett durchlaufen?

    Bei jedem Aufruf von power wird die Funktion neu von oben nach unten abgearbeitet.


  • Mod

    p fangt immer mit dem Wert 1 an, alle Funktionsaufrufe sind komplett unabhängig voneinander. Vielleicht solltest du noch einmal darüber nachdenken, was die Zeilen 23 und 24 machen.



  • SG1 schrieb:

    p behält nicht den vorherigen Wert bei.

    SG1 schrieb:

    Bei jedem Aufruf von power wird die Funktion neu von oben nach unten abgearbeitet.

    Gut, dann habe ich das richtig verstanden. Mein Fehler lag woanders.

    SeppJ schrieb:

    p fangt immer mit dem Wert 1 an, alle Funktionsaufrufe sind komplett unabhängig voneinander. Vielleicht solltest du noch einmal darüber nachdenken, was die Zeilen 23 und 24 machen.

    Tausend Dank für deine Antwort.

    Ich hab das mal wirklich der Reihe nach abgearbeitet. Nun verstehe ich auch, wo mein Fehler lag, und zwar genau bei Zeile 23 und 24. Die wird ja durchlaufen, sofern die Bedingung i <= n wahr ist. Im Zuge dessen wird p ja auch mehrmals berechnet. 🙄

    power (2,0)
    i > 0, keine Rechnung, return 1 da p auf 1 gesetzt

    power (2,1)
    i = 1 = n, daher 1x2, p = 2, i++
    i = 2 > n, keine Rechnung, i++
    und so weiter, return 2

    power (2,2)
    i = 1 < n, daher 1x2, p= 2, i++
    i = 2 = n, daher 2x2, p=4, i++
    i = 3 > n, keine Rechnung, i++
    und so weiter, daher sind p und return 4

    power (2,3)
    i = 1 < n, daher 1x2, p=2, i++
    i = 2 < n, daher 2x2, p=4, i++
    i = 3 = n, daher 4x2, p=8, i++
    i = 4 > n, keine Rechnung, p=8, i++
    return ist also 8


Anmelden zum Antworten