do-while Schleife
Führt eine Anweisung wiederholt aus, bis der Wert des Bedingungs-Ausdrucks falsch wird. Die Prüfung erfolgt nach jeder Iteration.
Inhalt |
[bearbeiten] Syntax
attr-spec-seq(optional) do Anweisung while ( Ausdruck ) ; |
|||||||||
| expression | - | Beliebiger Ausdruck vom skalaren Typ. Dieser Ausdruck wird nach jeder Iteration ausgewertet, und wenn er gleich Null ist, wird die Schleife beendet. |
| Anweisung | - | Beliebige Anweisung, typischerweise eine zusammengesetzte Anweisung, die den Körper der Schleife bildet |
| attr-spec-seq | - | (C23) Optionale Liste von Attributen, angewendet auf die Schleifenanweisung |
[bearbeiten] Erklärung
Eine do-while-Anweisung bewirkt, dass die Anweisung (auch Schleifenkörper genannt) wiederholt ausgeführt wird, bis der Ausdruck (auch steuernder Ausdruck genannt) gleich 0 ist. Die Wiederholung erfolgt unabhängig davon, ob der Schleifenkörper normal oder durch ein goto in die Mitte der Anweisung betreten wird.
Die Auswertung des Ausdrucks erfolgt nach jeder Ausführung der Anweisung (unabhängig davon, ob sie normal oder durch einen goto betreten wurde). Wenn der steuernde Ausdruck vor dem Schleifenkörper ausgewertet werden muss, können die while-Schleife oder die for-Schleife verwendet werden.
Wenn die Ausführung der Schleife an einem bestimmten Punkt beendet werden muss, kann eine break-Anweisung als beendende Anweisung verwendet werden.
Wenn die Ausführung der Schleife am Ende des Schleifenkörpers fortgesetzt werden muss, kann eine continue-Anweisung als Abkürzung verwendet werden.
Ein Programm mit einer Endlosschleife hat undefiniertes Verhalten, wenn die Schleife in keinem Teil ihrer Anweisung oder ihres Ausdrucks ein beobachtbares Verhalten (I/O, volatile Zugriffe, atomare oder Synchronisationsoperation) aufweist. Dies ermöglicht es den Compilern, alle nicht beobachtbaren Schleifen zu optimieren, ohne zu beweisen, dass sie terminieren. Die einzigen Ausnahmen sind Schleifen, bei denen der Ausdruck ein konstanter Ausdruck ist; do {...} while(true); ist immer eine Endlosschleife.
|
Wie alle anderen Auswahl- und Iterationsanweisungen etabliert die do-while-Anweisung einen Block-Scope: Jeder Bezeichner, der im Ausdruck eingeführt wird, gerät nach der Anweisung aus dem Gültigkeitsbereich. |
(seit C99) |
[bearbeiten] Anmerkungen
Boolesche und Zeigerausdrücke werden oft als schleifensteuernde Ausdrücke verwendet. Der boolesche Wert false und der Nullzeigerwert eines beliebigen Zeigertyps werden gleich Null verglichen.
[bearbeiten] Schlüsselwörter
[bearbeiten] Beispiel
#include <stdio.h> #include <stdlib.h> enum { SIZE = 8 }; int main(void) { // trivial example int array[SIZE], n = 0; do array[n++] = rand() % 2; // the loop body is a single expression statement while(n < SIZE); puts("Array filled!"); n = 0; do { // the loop body is a compound statement printf("%d ", array[n]); ++n; } while (n < SIZE); printf("\n"); // the loop from K&R itoa(). The do-while loop is used // because there is always at least one digit to generate int num = 1234, i=0; char s[10]; do s[i++] = num % 10 + '0'; // get next digit in reverse order while ((num /= 10) > 0); s[i] = '\0'; puts(s); }
Mögliche Ausgabe
Array filled! 1 0 1 1 1 1 0 0 4321
[bearbeiten] Referenzen
- C17-Standard (ISO/IEC 9899:2018)
- 6.8.5.2 Die do-Anweisung (S. 109)
- C11-Standard (ISO/IEC 9899:2011)
- 6.8.5.2 Die do-Anweisung (S. 151)
- C99-Standard (ISO/IEC 9899:1999)
- 6.8.5.2 Die do-Anweisung (S. 136)
- C89/C90-Standard (ISO/IEC 9899:1990)
- 3.6.5.2 Die do-Anweisung
[bearbeiten] Siehe auch
| C++ Dokumentation für
do-while Schleife |