while Schleife ohne Klammern

FBIBrot

Mitglied
Hallo,
ich habe folgende Aufgabe:

"Die folgenden Programmzeilen stammen aus einem Java-Programm. Welchen
Wert haben ganz und i während und nach Abarbeitung der Schleife? Arbeiten Sie diese Schleife
systematisch ab.
int i = 4;
int ganz = 10;

while (i++ <= 6)
ganz++;
"
Nach meiner ersten Überlegung sollte nach Ende der Abarbeitung ganz=13 und i=7 lauten.
Wenn ich jedoch das Programm schreibe, dann kommt ganz=13 und i=8 raus.
Jetzt hab ich gemerkt, wenn ich while in geschweifte Klammern setze, dann kommt tatsächlich das raus, was ich mir überlegt hatte.

Warum ändert sich das Ergebnis je nachdem ob Klammern gesetzt sind oder nicht? Ich steh grad total auf dem Schlauch und komme einfach nicht drauf, warum "ganz" trotzdem gleich bleibt, aber "i" unterschiedlich wird. Kann jemand helfen und es verständlich erklären?
 
Um dir wirklich weiter helfen zu können, solltest du den den gesammten Quellcode wiedergeben. Das Problem könnte an deiner Klammersetzung und an der Auslesung der Variable liegen.
 
public class Aufgabe3a {

public static void main (String[] args) {

int i = 4;
int ganz = 10;


while (i++ <= 6)
ganz++;
System.out.println(ganz);
System.out.println(i);
}
}

Hier kommt für ganz:13 und für i:8 raus

Wenn ich schreibe:

while (i++ <= 6) {
ganz++;
System.out.println(ganz);
System.out.println(i);
}

Kommt für ganz:13 und für i:7 raus.

Ich hatte irgendwo gelesen, dass ohne geschweifte Klammer beim while nur die Anweisungen bis zum ersten Semikolon abgearbeitet werden, aber das verstehe ich irgendwie nicht.
 
Moin,

while (i++ <= 6)
ganz++;
System.out.println(ganz);
System.out.println(i);

Ich hatte irgendwo gelesen, dass ohne geschweifte Klammer beim while nur die Anweisungen bis zum ersten Semikolon abgearbeitet werden, aber das verstehe ich irgendwie nicht
Richtig, durch die Klammerung kannst Du mehrere Anweisungen pro Duchlauf ausführen ...

Dein
Java:
while (i++ <= 6)
ganz++;
System.out.println(ganz);
System.out.println(i);
entspricht also implizit dem hier :
Java:
while (i++ <= 6)
{
    ganz++;
}
System.out.println(ganz);
System.out.println(i);

Das ist bspw. das Gleiche wie bei if-Anweisungen - ohne Klammern gehört immer nur die nächste Anweisungen dazu!

Gruß
Klaus
 
Dem Gesagten kann ich nur zustimmen. Daher ist es am besten, die Klammern stets zu setzen, um Fehler dieser Art auszuschließen.
Weiterführend sollte man die hier schon angesprochenen Formen der Inkrementationen in der Abbruchbedingung der Schleife erwähnen.

Präinkrement:
Java:
while(++i <= 6){
.........
}
Hierbei wird erst die Variable um eins erhöht und dann mittels des Vergleichsoperator mit der 6 verglichen.


Postinkrement:
Java:
while(i++ <= 6){
.........
}
Hier erfolgt erst der Vergleich und dann das Inkrement.

Das führt dazu, dass der Schleifenabbruch bei einer um eins verschiedenen Anzahl von Schleifendurchläufen erfolgt.
 
Vielen herzlichen Danke, jetzt hab ich es verstanden! :idea:

Kann mir vielleicht jemand noch ganz schnell erklären, weshalb hier false rauskommt:

public class Aufgabe {

public static void main(String[] args) {

char[] eins = {'a','b','c','d','e'};
char[] zwei = {'a','b','c','d','e'};

System.out.println(eins==zwei);

}

}


Dann wären all meine Probleme gelöst! Alle Werte sind doch gleich ???:L
 
Trotz der Gleichheit der Arrays kommt ein false zurück, weil du nicht den Inhalt der Arrays vergleichst, sondern die Referenzen der beiden. Du erzeugst zwei unterschiedliche Arrays und diese haben auch unterschiedliche Referenzen unabhängig des gleichen Inhaltes.
Möchtest du die Inhalte vergleichen, solltest du am besten eine Methode mit einer for-Schleife benutzen, die ein boolean-Wert zurück gibt. Als Parameter kannst du die zu vergleichenen Arrays verwenden.
 

Zurück
Oben