Anfängerfrage

Ich habe eine Frage.
Bei diesem Fragment:

 int j; 
 for (i = 0, j = 0; j < i; ++j, i++) { 
     System.out.println(i  + " " + j); 
 } 
 System.out.println(i + " " + j); ```

wird eine Endlosschleife ausgegeben, immer 0 0. Aber ich verstehe die Abarbeitung nicht so ganz.
Erst werden i und j mit 0 initialisiert. Wird dann der Vergleich j < i gemacht, der ja immer false ist und deshalb nicht erhöht? Oder sollte erst j um eins erhöht werden, bevor der Vergleich gemacht wird? 

Vielen Dank im Voraus
Gruß Mel

Ich verstehe Deine Frage nicht wirklich. j und i sind 0. Deswegen ist die Bedingung beim Schleifeneintritt schon false. Deswegen wird der Schleifenköper nie betreten. Und deswegen ist es auch ganz sicher keine Endlosschleife.

Aber was ist die Frage?

Ebenius

Hallo und danke erstmal für Dein Feedback.
Mit der Endlosschleife, da hab’ ich mich vertan. Es gibt nur einmal 0 0 aus. Was ich nicht verstand (jetzt aber weiß), war, wie die Reihenfolge der Abarbeitung war. Ich las mal, das bei „++i“ z.B. erst i um eins erhöht wird und dann mit diesem Wert weitergearbeitet wird. Jetzt habe ich aber erfahren, das dies in der Schleife irrelevant ist und nur für Zuordnungen gilt. Ich bin einfach gestolpert über „++j“ und „i++“. Das hatte mich aus dem Konzept gebracht. Vermutlich die Intention des Autors :mad:
Naja, ich geb’s ja zu: ich bin ein Wurm :stumm: :stuck_out_tongue_winking_eye:

Lg
Mel

Unwürdig, unwürdig. :smiley:

So wie Du’s beschriebst, stimmt’s.

Ebenius

Stimmt auch. Aber da in einer for-Schleife diese Operatoren erst nach dem ersten Durchlauf ausgeführt werden, ist es in diesem Fall egal :wink: . Ist also eher eine Eigenart der for-Schleife und hat in erster Linie nichts mit einem post- oder präfix zu tun

Die Erklärung ist falsch. Diese for-Schleife ist eine Endlosschleife: for (int i = 0, j = 0; i == j; i++, --j) { // ... }
Ebenius

[QUOTE=Ebenius]Die Erklärung ist falsch. Diese for-Schleife ist eine Endlosschleife: for (int i = 0, j = 0; i == j; i++, --j) { // ... }
Ebenius[/QUOTE]

Äh … nein!?

…aber es ist doch korrekt, dass es in meinem Beispiel egal ist, ob jetzt gestanden hätte ++j oder j++, oder? mensch… und hört bitte auf, mich zu verwirren :confused:

ja, das ist korrekt.

Sorry, wie ist da ein „–“ statt eines „++“ reingerutscht? Ich meinte natürlich zwei Inkrements, das eine Post, das andere Prä. Dann ist’s eine Endlosschleife.

Ebenius

Und warum ist dann meine Erklärung falsch? Genau das habe ich doch auch gesagt :confused:

Diese Erklärung ist falsch, weil es unerheblich ist, ob die Operationen erst nach dem ersten Durchlauf ausgeführt werden. Meine Beispielschleife (nach der Korrektur) läuft unendlich. Post-Inkrement und Prä-Inkrement machen keinen Unterschied; nicht weil die Operationen erst nach dem ersten Durchlauf ausgeführt werden, und nicht weil da was speziell an der for-Schleife ist. Sondern, weil schlichtweg keine weitere Zuweisung des mit Prä-/Post-Inkrement veränderten Wertes stattfindet.

Ich hoffe, ich hab’s jetzt erklären können.

Ebenius

Versteh ich immer noch nicht.

Im Pseudocode würde diese Schleife ja ungefähr so aussehen:

1.) Initialisiere i und j mit 0
2.) Vergleiche i und j, falls i und j gleich, mache weiter, ansonsten Ende
3.) Erhöhe i um den Wert 1
4.) Erhöhe j um den Wert 1
5.) Gehe zu 2.)

Und das trifft doch genau meine Aussage!? Oder ist der Ablauf der Schleife etwa anders?

Das ist alles richtig. Es taugt aber nicht als Erklärung für das obige Problem. Völlig egal, ob zuerst geprüft wird oder nicht; i++ und ++i haben keinen Unterschied, so lange sie nicht innerhalb einer anderen Zuweisung auftauchen.

Irgendwie reden wir aneinander vorbei; woran ich ganz und gar nicht unschuldig bin. :slight_smile:

Ebenius

Ich denke im Grunde meinen wir beide das Selbe, es wurde sich vermutlich nur undeutlich ausgedrückt. Ich hätte gesagt, wir belassen das jetzt einfach so. Die eigentliche Frage ist ja geklärt.