while-Schleife
Führt eine Anweisung bedingt wiederholt aus.
Inhalt |
[bearbeiten] Syntax
attr (optional) while ( Bedingung ) Anweisung |
|||||||||
| attr | - | (seit C++11) eine beliebige Anzahl von Attributen |
| condition | - | eine Bedingung |
| Anweisung | - | eine Anweisung (typischerweise eine zusammengesetzte Anweisung) |
[bearbeiten] Bedingung
Eine condition kann entweder ein Ausdruck oder eine einfache Deklaration sein.
|
(seit C++26) |
- Wenn sie syntaktisch als Ausdruck aufgelöst werden kann, wird sie als Ausdruck behandelt. Andernfalls wird sie als Deklaration behandelt, die keine strukturierte Bindungsdeklaration ist(seit C++26).
Wenn die Steuerung die Bedingung erreicht, liefert die Bedingung einen Wert, der verwendet wird, um zu bestimmen, ob die Anweisung ausgeführt wird.
[bearbeiten] Ausdruck
Wenn condition ein Ausdruck ist, ist der gelieferte Wert der Wert des Ausdrucks, der kontextuell zu bool konvertiert wird. Wenn diese Konvertierung fehlerhaft ist, ist das Programm fehlerhaft.
[bearbeiten] Deklaration
Wenn condition eine einfache Deklaration ist, ist der gelieferte Wert der Wert der Entscheidungsvariable (siehe unten), kontextuell zu bool konvertiert. Wenn diese Konvertierung fehlerhaft ist, ist das Programm fehlerhaft.
[bearbeiten] Nicht-strukturierte Bindungsdeklaration
Die Deklaration hat folgende Einschränkungen
- Folgt syntaktisch der folgenden Form
|
(bis C++11) |
|
(seit C++11) |
- Der Deklarator darf keine Funktion oder ein Array angeben.
- Die Typ-Spezifizierer-Sequenz(bis C++11)Deklarations-Spezifizierer-Sequenz darf nur Typ-Spezifizierer und constexpr enthalten, und sie(seit C++11) darf keine Klasse oder Aufzählung definieren.
Die Entscheidungsvariable der Deklaration ist die deklarierte Variable.
Strukturierte BindungsdeklarationDie Deklaration hat folgende Einschränkungen
Die Entscheidungsvariable der Deklaration ist die erfundene Variable e, die durch die Deklaration eingeführt wird. |
(seit C++26) |
[bearbeiten] Erklärung
Eine while-Anweisung ist äquivalent zu
/* Label */ :
|
|||||||||
Wenn Bedingung eine Deklaration ist, wird die von ihr deklarierte Variable mit jeder Iteration der Schleife zerstört und neu erstellt.
Wenn die Schleife innerhalb von statement beendet werden muss, kann eine break-Anweisung als beendende Anweisung verwendet werden.
Wenn die aktuelle Iteration innerhalb von statement beendet werden muss, kann eine continue-Anweisung als Abkürzung verwendet werden.
[bearbeiten] Anmerkungen
Unabhängig davon, ob Anweisung eine zusammengesetzte Anweisung ist, führt sie immer einen Block-Scope ein. Darin deklarierte Variablen sind nur im Schleifenkörper sichtbar, mit anderen Worten:
while (--x >= 0) int i; // i goes out of scope
ist dasselbe wie
while (--x >= 0) { int i; } // i goes out of scope
Als Teil der C++ Fortschrittsgarantie ist das Verhalten undefiniert, wenn eine Schleife, die keine triviale Endlosschleife ist(seit C++26) ohne beobachtbares Verhalten nicht terminiert. Compiler dürfen solche Schleifen entfernen.
[bearbeiten] Schlüsselwörter
[bearbeiten] Beispiel
#include <iostream> int main() { // while loop with a single statement int i = 0; while (i < 10) i++; std::cout << i << '\n'; // while loop with a compound statement int j = 2; while (j < 9) { std::cout << j << ' '; j += 2; } std::cout << '\n'; // while loop with a declaration condition char cstr[] = "Hello"; int k = 0; while (char c = cstr[k++]) std::cout << c; std::cout << '\n'; }
Ausgabe
10 2 4 6 8 Hello
[bearbeiten] Siehe auch
| C-Dokumentation für while
|