while-Schleife
Führt eine Anweisung wiederholt aus, bis der Wert des Ausdrucks gleich Null wird. Der Test findet vor jeder Iteration statt.
Inhalt |
[bearbeiten] Syntax
attr-spec-seq(optional) while ( Ausdruck ) Anweisung |
|||||||||
| expression | - | beliebiger Ausdruck eines skalaren Typs. Dieser Ausdruck wird vor jeder Iteration ausgewertet, und wenn er gleich Null ist, wird die Schleife beendet. |
| Anweisung | - | beliebige Anweisung, typischerweise eine zusammengesetzte Anweisung, die als Körper der Schleife dient |
| attr-spec-seq | - | (C23)optionale Liste von Attributen, angewendet auf die Schleifenanweisung |
[bearbeiten] Erklärung
Eine while-Anweisung bewirkt, dass die Anweisung (auch als Schleifenkörper bezeichnet) wiederholt ausgeführt wird, bis der Ausdruck (auch als Steuerausdruck bezeichnet) gleich Null ist. Die Wiederholung erfolgt unabhängig davon, ob der Schleifenkörper normal betreten wird oder durch ein goto in die Mitte der Anweisung.
Die Auswertung des Ausdrucks erfolgt vor jeder Ausführung der Anweisung (es sei denn, sie wird durch ein goto betreten). Wenn der Steuerausdruck nach dem Schleifenkörper ausgewertet werden muss, kann die do-while-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 keine beobachtbaren Effekte (I/O, volatile-Zugriffe, atomare oder Synchronisationsoperationen) in irgendeinem Teil ihrer Anweisung oder ihres Ausdrucks hat. Dies ermöglicht es den Compilern, alle nicht beobachtbaren Schleifen zu optimieren, ohne nachzuweisen, dass sie terminieren. Die einzigen Ausnahmen sind Schleifen, bei denen der Ausdruck ein konstanter Ausdruck ist; while(true) ist immer eine Endlosschleife.
|
Wie bei allen anderen Auswahl- und Iterationsanweisungen etabliert die while-Anweisung einen Block-Gültigkeitsbereich: Jany Identifier, der im Ausdruck eingeführt wird, verlässt den Gültigkeitsbereich nach der Anweisung. |
(seit C99) |
[bearbeiten] Notizen
Boolesche und Zeigerausdrücke werden oft als Schleifen-Steuerausdrücke verwendet. Der boolesche Wert false und der Nullzeigerwert eines beliebigen Zeigertyps sind gleich Null.
[bearbeiten] Schlüsselwörter
[bearbeiten] Beispiel
#include <stdio.h> #include <stdlib.h> #include <string.h> enum { SIZE = 8 }; int main(void) { // trivial example int array[SIZE], n = 0; while(n < SIZE) array[n++] = rand() % 2; puts("Array filled!"); n = 0; while(n < SIZE) printf("%d ", array[n++]); printf("\n"); // classic strcpy() implementation // (copies a null-terminated string from src to dst) char src[] = "Hello, world", dst[sizeof src], *p = dst, *q = src; while((*p++ = *q++)) // double parentheses (that are not strictly necessary) // used to suppress warnings, ensuring that this is an // assignment (as opposed to a comparison) by intention, // whose result is used as a truth value ; // null statement puts(dst); }
Ausgabe
Array filled! 1 0 1 1 1 1 0 0 Hello, world
[bearbeiten] Referenzen
- C17-Standard (ISO/IEC 9899:2018)
- 6.8.5.1 Die while-Anweisung (S. 109)
- C11-Standard (ISO/IEC 9899:2011)
- 6.8.5.1 Die while-Anweisung (S. 151)
- C99-Standard (ISO/IEC 9899:1999)
- 6.8.5.1 Die while-Anweisung (S. 136)
- C89/C90-Standard (ISO/IEC 9899:1990)
- 3.6.5.1 Die while-Anweisung
[bearbeiten] Siehe auch
| C++ Dokumentation für
while-Schleife |