Was ist der Unterschied zwischen einer For- und While- Schleife?

6 Antworten

For braucht immer eine bestimmte Anzahl von Durchführungen.

While ist potentiell unendlich, solange halt bis etwas nicht mehr zutrifft.

Das stimmt nicht ganz:

int intvar;
boolean boolvar=true;
for(intvar=0;boolvar;intvar++)
{
    ...
}
1

Nein:

while (true) { System.out.println("unendlich"); }
// ... entspricht ...
for (;;) { System.out.println("unendlich"); }

oder:

int i = 0; while (true) { if (i > 100) break; System.out.println("endlich"); i++; }
// ... entspricht ...
for (int i = 0; ; i++) { if (i > 100) break; else System.out.println("endlich"); }

Initialisierung, Bedingung und Anweisung nach jedem Durchlauf sind sowohl bei for als auch bei while optional!

0

Eine For-Schleife ist (in Java und anderen C-ähnlichen Sprachen) eine spezielle Form der While-Schleife:

for (initialization; condition; increment) {body}

ist äquivalent zu

initialization;
while (cond) {body; increment}

Eine for-Schleife nimmt man vorzugsweise, wenn vor Schleifenbeginn bekannt ist, wie viele Durchläufe man braucht und man einen Zähler hat. Das wird allgemein für übersichtlicher gehalten.

Kurz gesagt:

Zähler => for-Schleife

sonstige Bedingungen => While-Schleife (oder je nach Problemstellung auch Do-While-Schleife, ggf. mit break)

Für Beispiele siehe z. B. http://www.c-howto.de/tutorial-schleifen.html und folgende Seiten.

Woher ich das weiß:Berufserfahrung – Software-Entwickler

Noch eine kleine Erläuterung dazu:

In anderen Programmiersprachen (Basic, Pascal, Matlab, Python, ...) funktioniert die For-Schleife prinzipiell ganz anders als die While-Schleife (es gibt dort ebenfalls beide Typen).

Die For-Schleife wird in C-ähnlichen Sprachen (Java, PHP, C++, ...) in der Regel dort verwendet, wo in den anderen Programmiersprachen ebenfalls eine For-Schleife verwendet wird.

Allerdings kann man in C-ähnlichen Programmiersprachen eine While-Schleife durch eine For-Schleife ersetzen und umgekehrt. Das ist bei den anderen Programmiersprachen (Basic, Pascal, ...) nicht oder nur bedingt möglich.

Und noch etwas: In neueren Java-Versionen kann man die For-Schleife genau so wie in Matlab (und Python ?) verwenden:

for( Object o : objectList ) { ... }

Das geht aber nur in neueren Java-Versionen.

3
@martin7812

Die von dir beschriebene Form nennt sich "foreach" Schleife. Der Gedanke dahinter ist, das viele for Schleifen lediglich zum iterieren durch eine Liste und aufrufen von Methoden auf den einzelnen Elementen der Liste .

0
@martin7812
... (und Python ?) ...

Ja, Python auch. Beispiel:

with codecs.open('x.txt', 'r', 'utf-8', 'strict') as fp:
    for line in fp:
        print(line)

Das hat aber etwas mit Iteratoren (yield-Keyword) zu tun, und ist im Grunde genommen keine reine Zählschleife.

Bei Zahlen würde es folgendermaßen aussehen (Beispiele in Python 3.x):

for i in range(10):
    print(i)

... oder mit while so:

i = 0
while (i < 10):
    print(i)
    i += 1

Mit for iteriert man also über Objekte und mit while "zählt" man. :)

0

Im Großen und Ganzen ist es "nur" ein Unterschied in der Syntax.

Die Antwort von PWolff erklärt hier fast alles. Guck ruhig noch mal in die Wikipedia, falls noch Unklarheiten herschen.

Wenn man sich mal das Disassemblat von zwei C-Implementierungen ansieht, die sich nur im Schleifentyp unterschieden, stellt man (meistens) keinen Unterschied fest. (von speziellen Compileroptimierungen mal abgesehen)

(Im Gegensatz dazu ist if-elseif-else und switch-case-default KEIN reiner Syntaxunterschied und liefert komplett anderen Maschinencode nach dem Kompilieren!!!)

Und wenn du ein ganz Perverser bist, kannst du auch deine eigenen Schleifen mit goto und if basteln. :) (Davon ist aber ausdrücklich abzuraten!!!)

Anmerkung: Nach dem Lesen der anderen Antworten ist mir aufgefallen, dass ich wohl nur zu sehr auf C fixiert war und muss einige Aussagen revidieren.

Bei vielen Skriptsprachen wird die for-Schleife zum iterieren über Objekte benutzt und dann teilweise foreach genannt, oder mit einer etwas anderen Syntax aufgerufen.

Beispiel in Java:

String[] a = "a b c d e f".split(" ");
for (String s : a) {
    System.out.println(s);
}

... ist äquivalent zu:

String[] a = "a b c d e f".split(" ");
for (int i = 0; i < a.length; i++) {
    System.out.println(a[i]);
}

... wobei man Letzteres auch mit while darstellen kann:

String[] a = "a b c d e f".split(" ");
int i = 0;
while (i < a.length) {
    System.out.println(a[i]);
    i++;
}

Ähnliche Syntax auch in PHP, Python, und und und ...

0