2016-09-03 7 views
0

Ich habe Probleme mit dem Erhalten, warum auch ein Teil des Code ausgeführt wird:Java: Probleme mit i ++

private int m; 
private int n; 

public void f() { 
    m = (m +2) % n; 
    System.out.print(m+"\n"); 
} 

public void g() { 
    int i=0; 
    m=0; 
    n=8; 
    while (i++<n) { 
     System.out.print("i=" + i + " m="); 
     f(); 
    } 
} 

Wenn ich g() laufen, ich folgendes ausgedruckt bekommen:

i++=1 m=2 
i++=2 m=4 
i++=3 m=6 
i++=4 m=0 
i++=5 m=2 
i++=6 m=4 
i++=7 m=6 
i++=8 m=0 

Wie ich Verstehe es, die letzte Zeile sollte nicht erscheinen. Warum erhält f() das letzte Mal?

Wenn f() das erste Mal aufgerufen wird, i = 0 und dort für i++ = 1. (so, wenn ich i drucke, ist es bereits gleich 1).

Wenn ich f() das vorletzte Mal anrufen, i = 6, und dort für i++ = 7. Das ist das letzte ganze, das < n (n = 8) ist.

Warum wird die Funktion erneut aufgerufen, wenn i++ bereits = 8 ist? Das verwirrt mich wirklich.

+1

Kennen Sie den Unterschied zwischen 'i ++' und '++ i'? Wenn nicht, recherchiere das, dann weißt du, warum dein Code so funktioniert. – Tom

+0

Wie ist es möglich, solche Ausgaben zu erhalten? Kann nicht reproduzieren! – xenteros

+0

@xenteros http://ideone.com/jr9QDr – Tom

Antwort

2

Versuchen Sie ++i anstelle von i++.

Dies hat mit der Tatsache zu tun, dass: „Inkrement i und gibt die sich ergebende Zahl zur nächsten Operator zu verarbeiten“

  • ++i Mittel (PRE-increment)
  • i++ bedeutet "geben Sie den Wert von i zur nächsten Operation zurück, und erhöhen Sie i NACHDEM Sie dies tun." (POST-Inkrementierung)
+0

In vielen Codierungsstilen ist es eine schlechte Übung, '++' in Anweisungen zu verwenden, da dies zu Verwirrung führt. (Bemerkenswerte Ausnahme kann eine Array-Iteration mit 'array [i ++]' sein.) –

+0

Ja, ich bin auch kein Fan davon, Inkremente zu mischen und überhaupt zu vergleichen. Besonders wenn Parens den Unterschied auch maskieren würden (wenn das i ++ in Parens wäre, würde das OP nicht bemerkt haben). Ich verstehe, warum C-ähnliche Sprachen das haben (oft gibt es ein Assembly-Konstrukt, das nicht weit entfernt ist), aber yuck. –

2

Dies liegt daran, dass i ++ post increment ist. Das bedeutet, dass es nach dem Vergleich mit n erhöht wird. Sie müssen ++ i verwenden, wenn Sie i, bevor die erhöhen, wollen

2

n vergleichen Wenn Sie:

while(i++<n){ 
... 
} 

Es ist, als ob Sie hätte:

while(i<n){ 
i++; 
... 
} 

Der Wert zuerst bekommt verwendet, und dann inkrementiert.

Wenn Sie den Wert wollen zuerst werden erhöht und dann in Auswertung der Bedingung verwendet, würden Sie nur verwenden:

while(++i<n){ 
... 
} 

Beachten Sie, dass dies wahr ist nicht nur während, sondern auch mit, wenn , für, Do-While und jede andere Inline-Auswertung Ihrer Variablen.

+0

Können Sie beschreiben, was ist der Unterschied? – Punga

3

Verwenden Sie ++i anstelle von i++.

  • i ++ erstellt eine Kopie erhöht i, und gibt die Kopie, so wird es den alten Wert von i (Beitrag Increment) zurückzukehren.

  • ++ i erhöht i und gibt i den aktualisierten Wert (Pre increment) zurück.

Also, wenn Sie den Zustand überprüfen i++<n es mit dem alten Wert überprüft wird, so dass die Bedingung true ausgewertet wird.