While(1) und for(;;) unterschied C++?

... komplette Frage anzeigen

4 Antworten

Die for- und die while-Schleife machen aus technischer Sicht in dem Fall genau das Gleiche. while(1) bzw. noch besser while(true) liest sich mMn. nur besser, da sieht der Programmierer mit etwas Erfahrung eher auf den ersten Blick, dass das eine Endlosschleife ist. Bei for(;;) muss man erst rätseln.

Endlossschleifen können in manchen Situationen nützlich sein, ein Beispiel ist die "Game Loop", die Hauptschleife in Videospielen.

https://de.wikipedia.org/wiki/Game\_Loop

, die in Spielen verwendet wird - denn so ein Spiel soll auch weiter laufen, wenn der Spieler nichts macht. So eine Schleife läuft ja nicht zwangsläufig wirklich endlos, sondern kann innerhalb der Schleife mit "break" oder  "return" abgebrochen werden. 

Anderes Beispiel: (Ich hoffe, ich habe mich im Code nicht vertippt). Ich möchte eine Funktion schreiben, die mir von einer gegebenen Zahl die nächsthöhere Primzahl verrät. Ein (etwas ineffizienter) Lösungsvorschlag in Pseudocode dafür wäre.

function nextPrime(minNumber:int) {
  candidate = minNumber;
  while (true) {
    candidate++;
    isPrime = true;
    for (int i = 2; i < cand; i++) {
      if (candidate % i == 0) {
      isPrime = false;
      break;
      }
    if (isPrime == true) {
      return candidate;
      }
    }
  }
}

Antwort bewerten Vielen Dank für Deine Bewertung

Das Letztere hat mehr Sinn. Solche Endlosschleifen werden mit einer anderer Bedingung versehen, und wenn das richtig wird, dann ausspringen.

Mit While(1) könnte man auch das machen, aber warum schreibt dann nicht die Bedingung in while? Dann sollte man aber mit dieser Bedingung in der Schleife machen, und extra Variable einleiten, und diese Variable benutzen. Man kann das leichter versauen.

Antwort bewerten Vielen Dank für Deine Bewertung

eine for Schleife führt 3 Anweisungen aus...
1. die Initialisierung (vor dem ersten Semikolon)
2. einen Befehl (zwischen den Semikolons)
3. eine Bedingung (hinter dem 2. Semikolon)

Schritt 2 und 3 werden solange wiederholt, bis die Bedingung nicht mehr erfüllt wird...
also bei jedem Durchlauf werden 2 Anweisungen ausgeführt...

bei einer Do/While Schleife wird aber nur die Bedingung, also ein Schritt, je Durchlauf ausgeführt...

somit kann man sagen, dass eine for Schleife etwas langsamer ist, bei einer Endlosschleife, wie Du sie hier beschreibst...

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Isendrak
18.07.2017, 18:15

Du hast die Positionen von Bedingung und Anweisung vertauscht...

  1. Initialisierung (z.B. int i=0)
  2. Bedingung (z.B. i<10)
  3. Anweisung (z.B. ++i)

Ausserdem muss eine for(;;) Schleife nicht unbedingt aufgrund der erwähnten 2 Dinge langsamer sein als eine while(1)...

Das liegt daran, dass (zumindest die allermeisten) C/C++ Compiler vor dem eigentlichen Kompilieren noch eine Optimierung durchführen.

Und da im Endeffekt eine Endlosschleife auf folgendes hinausläuft:

:L0
NOP ;)
JMP L0

dürfte es bei einem Compiler mit guten Optimierungsfähigkeiten keinerlei Unterschied machen, ob for oder while...

2

Also ich hab gelernt: Wenn man in einer Endlosschleife landet hat man was falsch gemacht ^^ (Allerdings nicht C++, sondern PHP)

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von ceevee
18.07.2017, 18:57

Wenn man in einer Endlosschleife landet, die keine gültige Abbruchbedingung hat, dann hat man was falsch gemacht. ;)

PHP ist allerdings gewissermaßen auch noch ein Sonderfall, da dort Schleifen nicht endlos laufen können, weil der Webserver (also in der Regel Apache) irgendwann aussteigt, wenn ein PHP-Skript zu lange braucht. Echte C++-Endlosschleifen laufen hingegen bis zum jüngsten Gericht und noch darüber hinaus.

1

Was möchtest Du wissen?