for Schleife
Führt eine Schleife aus.
Wird als kürzere Entsprechung einer while-Schleife verwendet.
Inhalt |
[bearbeiten] Syntax
attr-spec-seq(seit C23)(optional) for ( init-clause ; cond-expression ; iteration-expression ) loop-statement |
|||||||||
[bearbeiten] Erklärung
Verhält sich wie folgt:
- init-clause kann ein Ausdruck oder eine Deklaration(seit C99) sein.
- Ein init-clause, der ein Ausdruck ist, wird einmal ausgewertet, bevor cond-expression zum ersten Mal ausgewertet wird, und sein Ergebnis wird verworfen.
|
(seit C99) |
- cond-expression wird vor dem Schleifenkörper ausgewertet. Wenn das Ergebnis des Ausdrucks Null ist, wird die Schleife sofort beendet.
- iteration-expression wird nach dem Schleifenkörper ausgewertet und sein Ergebnis wird verworfen. Nach der Auswertung von iteration-expression wird die Kontrolle an cond-expression übergeben.
init-clause, cond-expression und iteration-expression sind alle optional. Wenn cond-expression weggelassen wird, wird es durch eine ganzzahlige Konstante ungleich Null ersetzt, was die Schleife endlos macht.
for(;;) { printf("endless loop!"); }
loop-statement ist nicht optional, kann aber eine Null-Anweisung sein.
for(int n = 0; n < 10; ++n, printf("%d\n", n)) ; // null statement
Wenn die Ausführung der Schleife an einem bestimmten Punkt beendet werden muss, kann eine break-Anweisung überall innerhalb von loop-statement verwendet werden.
Die continue-Anweisung, die überall innerhalb von loop-statement verwendet wird, überträgt die Kontrolle an iteration-expression.
Ein Programm mit einer Endlosschleife hat undefiniertes Verhalten, wenn die Schleife kein beobachtbares Verhalten (I/O, volatile-Zugriffe, atomare oder Synchronisationsoperationen) in irgendeinem Teil ihres cond-expression, iteration-expression oder loop-statement hat. Dies ermöglicht es Compilern, alle nicht beobachtbaren Schleifen zu optimieren, ohne nachweisen zu müssen, dass sie terminiert werden. Die einzigen Ausnahmen sind Schleifen, bei denen cond-expression weggelassen wird oder ein Konstantenausdruck ist; for(;;) ist immer eine Endlosschleife.
|
Wie bei allen anderen Auswahl- und Iterationsanweisungen legt die for-Anweisung einen Blockbereich fest: Jede im init-clause, cond-expression oder iteration-expression eingeführte Kennung geht nach dem loop-statement aus dem Bereich. |
(seit C99) |
|
attr-spec-seq ist eine optionale Liste von Attributen, die auf die |
(seit C23) |
[bearbeiten] Schlüsselwörter
[bearbeiten] Notizen
Die als loop-statement verwendete Ausdrucksanweisung legt ihren eigenen Blockbereich fest, der sich vom Bereich von init-clause unterscheidet, im Gegensatz zu C++.
for (int i = 0; ; ) { long i = 1; // valid C, invalid C++ // ... }
Es ist möglich, den Körper einer Schleife mit goto zu betreten. Wenn die Schleife auf diese Weise betreten wird, werden init-clause und cond-expression nicht ausgeführt. (Wenn die Kontrolle dann das Ende des Schleifenkörpers erreicht, kann eine Wiederholung erfolgen, einschließlich der Ausführung von cond-expression.)
[bearbeiten] Beispiel
Mögliche Ausgabe
Array filled! 1 0 1 1 1 1 0 0
[bearbeiten] Referenzen
- C17-Standard (ISO/IEC 9899:2018)
- 6.8.5.3 Die for-Anweisung (S. 110)
- C11-Standard (ISO/IEC 9899:2011)
- 6.8.5.3 Die for-Anweisung (S. 151)
- C99-Standard (ISO/IEC 9899:1999)
- 6.8.5.3 Die for-Anweisung (S. 136)
- C89/C90-Standard (ISO/IEC 9899:1990)
- 3.6.5.3 Die for-Anweisung
[bearbeiten] Siehe auch
| C++-Dokumentation für
for-Schleife |