2016-07-09 13 views
2

Ich bin neu in die Programmierung und während einige Fragen zu üben stieß ich auf einen Code in CWas wird die Ausgabe dieser beiden Codes sein?

void count(int n) 
{ 
    static int d = 1; 
    printf("%d ", n); 
    printf("%d ", d); 
    d++; 
    if(n > 1) count(n-1); 
    printf("%d ", d); 
} 
int main() 
{ 
    count(3); 
} 

Output: 
3 1 2 2 1 3 4 4 4 

Kann jemand mir das erklären, warum die Ausgabe nicht 3 1 2 1 2 3 4 wie ich erwarte ist. Ich habe versucht, diesen Code in Java zu schreiben und die Ausgabe ist nicht einmal in der Nähe meiner Erwartung

public static void main (String[] args) 
{ 
    count(3); 
} 
static void count(int n){ 
    int d = 1; 
    System.out.print(n+" "); 
    System.out.print(d+" "); 
    d++; 
    if(n>1)count(n-1); 
    System.out.print(d+" "); 

} 

Output: 
3 1 2 1 1 1 2 2 2 

Gibt es etwas ich fehle über Funktion und Methode Prozedur aufrufen.

+3

Warum hast du erwartet single '4' und nicht' 4 4 4'? Sie haben "count" dreimal aufgerufen und zuletzt "printf" ("% d", d); "ist immer gewährleistet, da es zu dieser Methode gehört und nicht Teil eines bedingten Blocks ist. In Bezug auf das Java-Codebeispiel ist "d" nicht statisch, also gehört es nicht zur Klasse, sondern ist einfach eine lokale Variable, so dass jedes Mal, wenn Sie die "count" -Methode aufrufen, ein eigenes "d" erzeugt, mit "1" initialisiert, inkrementiert und dann am Ende ausdrucken. – Pshemo

+0

In der C-Code, wenn Sie es mit Bleistift und Papier folgen, werden Sie sehen, dass die zusätzlichen '4' am Ende jeder Rekursion gedruckt werden. Erst nach dem rekursiven Aufruf 'count (n-1);' wird der zweite 'printf ("% d ", d);', nacheinander geschehen –

+1

[Es ist Déjà vu noch einmal] (http: // stackoverflow. com/questions/38281902/dont-use-compiler-c-programm-ausgabe-erklärung-benötigt-in-logik? noredirect = 1 # comment63982750_38281902). Schade, dass diese Frage gelöscht wurde.Und Ihre Java-Version ist nicht äquivalent, da die Variable "d" in dieser Quelle nicht statisch ist, wie in der C-Quelle. – WhozCraig

Antwort

3

In C behält eine Variable static ihren Wert bei Funktionsaufrufen.

Mit diesem Kontext können Sie sehen, was passiert, wenn count(3) aufgerufen wird.

count(3) 
prints: 3 1 

    count(2) 
    prints: 2 2 

     count(1) 
     prints: 1 3 4 

    count(2) 
    prints: 4 

count(3) 
prints: 4 

Sie fehlen die letzten beiden 4, weil Sie vergessen, dass:

once `count(1)` returns `count(2)` prints the value of `d` once more, and 
once `count(2)` returns `count(3)` prints the value of `d` once more 

Nun, für Ihre java Code ist es nicht gleichbedeutend mit dem C Code, weil d kein statisches Element ist . Sie können es ähnlich zu Ihrem C Code machen, indem Sie d ein statisches Mitglied machen.

/* ... Some code ...*/ 
static int d = 1; 
public static void main (String[] args) 
{ 
    count(3); 
} 

static void count(int n){ 
// Remove this line 
/*int d = 1;*/ 
/* ... same code ...*/ 
/* ... same code ...*/ 
} 

Dieser java Code soll gleiches Ergebnis wie Ihren C Code geben.

+0

Nun, ich denke, das Problem ist mit statischen, ich sollte anfangen, mehr über statische Variablen und Methoden zu lernen. –

0

als weather Vane erwähnt bereits im Kommentar die Rekursion verursacht diese Ausgabe. Wenn Sie Ihr expectet Ergebnis will denke, dass ich dies für Ihren c-Code helfen soll:

void count(int n) { 

    static int d = 1; 
    printf("%d ", n); 
    printf("%d ", d); 
    d++; 
    if (n > 1) 
    { 
     count(n - 1); 
    } 
    else 
    { 
     printf("%d ", d); 
    } 
} 

int main() 
{ 
    int b = 0; 
     count(3); 

} 
0

Die C-Methode eine statische Variable in einer Funktion verwendet, die nicht in Java getan werden kann. Eine statische Variable wird beim ersten Aufruf der Funktion initialisiert und erst bei späteren Funktionsaufrufen aktualisiert. Java ist kein Konzept wie diese haben jedoch die folgenden Schritte aus würde das gleiche:

private static int d=1; 

public static void main (String[] args) 
{ 
    count(3); 
} 

static void count(int n){ 
    System.out.print(n+" "); 
    System.out.print(d+" "); 
    d++; 
    if(n>1)count(n-1); 
    System.out.print(d+" "); 

} 
1

Dies ist, was Ihr Code tut, Zeile für Zeile:

für nichtig erklären Funktion mit Argument zählen n

Deklarieren Sie int d als static: Dies bedeutet, dass es durch Funktionsaufrufe gleich bleibt. Wenn Sie eine statische Variable inkrementieren, kehrt die Funktion zurück und die Funktion wird erneut aufgerufen. Die statische Variable bleibt inkrementiert.

static int d = 1; 

druckt das Argument und die statischen Variable d

printf("%d ", n); 
    printf("%d ", d); 

Erhöhungsschritte d (Achtung: Dies bedeutet, dass, wenn wir wieder count() nennen, die wir in der nächsten Zeile tun würden, d nicht

d++; 

Wenn n größer als 1 ist, mit n nennen zählen zu 1, aber bis 2) gleich - 1, als Argument

if(n > 1) count(n-1); 

Drucken d

printf("%d ", d); 
} 

Also, das ist, was es tut:

  • count() mit n als 3
  • n (3) gedruckt
  • d (1 genannt wird,) wird gedruckt
  • d wird um 1 inkrementiert, es ist jetzt 2
  • n (3) ist größer als 1
  • count() mit 2 als Argument aufgerufen
  • n (2) gedruckt
  • d (2) gedruckt wird
  • d (2) mit 1 erhöht wird, ist es jetzt 3
  • n (2) größer als 1
  • count() mit 1 als Argument aufgerufen wird
  • n (1) gedruckt
  • d (3) gedruckt wird
  • d mit 1 erhöht wird, ist es nun 4
  • n gleich einen
  • d (4) gedruckt
  • Wie wir Sie count() dreimal genannt haben vielleicht bemerkt, und es hat keine Zeit, zwei Mal zu beenden.
  • Die einzige Anweisung nach, wenn n > 1 Überprüfung links druckt d
  • Wir haben das zu tun, jetzt zweimal
  • d (4)
  • d (4) gedruckt wird
  • gedruckt
+0

danke für die Erklärung für mich Zeile für Zeile. Ich dachte, dass der letzte printf seit den letzten zwei Malen nicht ausgeführt wurde, da es der Teil der if-Anweisung war. Ich habe nicht gesehen, dass der printf nicht Teil des Konditionalblocks war. –

Verwandte Themen