2017-05-19 2 views
-6

Dieses C-Programm nimmt den in der Variablen a gespeicherten Wert und druckt sie einzeln aus.Wie funktioniert diese Foo-Funktion?

#include <stdio.h> 
void foo(int n, int sum) 
{ 
    int k = 0, j = 0; 

    if (n == 0) 
    return; 

    k = n % 10; 
    j = n/10; 

    sum = sum + k; 

    foo (j, sum); 

    printf ("%d, ", k); 
} 

int main() 
{ 
    int a = 2048, sum = 0; 
    foo (a, sum); 
    printf("\n"); 
    return 0; 
} 

Output:

2, 0, 4, 8, 

Wenn die Funktion foo ausführen:

1) zum ersten Mal: ​​n = 2048, k = 8, J = 204, sum = 8

2) zum zweiten Mal: ​​n = 204, k = 4 , j = 20, 12 sum =

3) zum dritten Mal: ​​n = 20, k = 0, J = 2, sum = 12

4) zum vierten Mal: ​​n = 2, k = 2, J = 0, sUM = 14

Wenn I ersetzen die Linie (in der foo-Funktion):

printf ("%d, ", k); 

mit diesem:

printf ("%d | %d, ", k, sum); 

Ausgang:

2 | 14, 0 | 12, 4 | 12, 8 | 8, 

Kann jemand bitte erklären, wie dieses Programm funktioniert:

1) Wie es in ein gespeicherten Druckwert?

2) Und in dieser Reihenfolge: 2, 0, 4, 8,?

3) Warum wird der Wert von Summe ändert, wenn wir Werte von k Druck?

4) Was würde passieren, wenn n 0 wird?

Antwort

1
  1. Sie rufen die Funktion foo unter a auf.
  2. Das ist die Reihenfolge, seit Sie drucken, nachdem Sie den Rest der Nummer verarbeitet haben. Versuchen Sie, den Anruf unter printf vor dem Anruf an foo in foo zu verschieben und sehen Sie, ob Sie etwas anderes erhalten.
  3. sum ändert sich, weil Sie sum = sum + k tun und es an alle zukünftigen Anrufe übergeben.
  4. Wenn n schließlich 0 aufgrund wiederholter Divisionen wird, beginnen Rückkehr der letzte Aufruf an foo beginnt Rückkehr und nach ihnen alle bisherigen Anrufe nach dem Drucken die Ziffer sie n % 10
+0

Dank für die Beantwortung mit extrahiert hatte. Wenn ich den Aufruf von "printf" über "foo" in "foo" verschiebe, ist hier die Ausgabe, die ich bekommen werde: '8, 4, 0, 2,' Tut mir leid, ich verstehe immer noch nicht, warum ich das sehe umgekehrte Ausgabe, wenn ich den Aufruf auf "printf" unter "foo" in "foo"? – iamthedarkknight

+0

Was Sie hier sehen, ist eine rekursive Funktion. Was bedeutet eine Funktion, die sich selbst aufruft. Was die Funktion macht, isoliert zuerst eine einzelne Ziffer von "n" und ruft sich selbst erneut auf, um den Rest zu verarbeiten. Auf diese Weise isolieren nachfolgende Aufrufe jede Ziffer, bis "n" gleich 0 wird. Danach beginnen die Funktionen zurückzukehren und vor der Rückgabe wird die Ziffer gedruckt, die sie isoliert haben. Die Ziffern isoliert sind "8", "4", "0" und "2" in dieser Reihenfolge. Während der Druck seit dem letzten Aufruf zuerst gedruckt wird, erhalten Sie die Reihenfolge '2 0 4 8' –

+0

Wenn Sie den Aufruf auf' printf' vor 'foo' setzen, drucken Sie die abgeschnittene Ziffer, BEVOR Sie den Rest der Zeichenkette ad verarbeiten Holen Sie zuerst die Ziffer, die zuerst extrahiert wurde. Ihnen geben 8 4 0 2. –