for loop
Führt eine Schleife aus.
Wird als kürzere Entsprechung einer while-Schleife verwendet.
Inhaltsverzeichnis |
Syntax
attr-spec-seq
(seit C23)
(optional)
for
(
init-clause
;
cond-expression
;
iteration-expression
)
loop-statement
|
|||||||||
Erklärung
Verhält sich wie folgt:
- init-clause kann ein Ausdruck sein oder eine Deklaration (seit C99) .
-
- Eine init-clause , die ein Ausdruck ist, wird einmal ausgewertet, vor der ersten Auswertung von cond-expression und ihr Ergebnis wird verworfen.
|
(seit C99) |
- cond-expression wird vor dem Schleifenkörper ausgewertet. Wenn das Ergebnis des Ausdrucks null ist, wird die Schleifenanweisung sofort verlassen.
- iteration-expression wird nach dem Schleifenkörper ausgewertet und ihr Ergebnis wird verworfen. Nach der Auswertung von iteration-expression wird die Steuerung an cond-expression übergeben.
init-clause , cond-expression und iteration-expression sind alle optional. Wenn cond-expression ausgelassen wird, wird es durch eine ganzzahlige Konstante ungleich Null ersetzt, was die Schleife endlos macht:
for(;;) { printf("Endlosschleife!"); }
loop-statement ist nicht optional, kann jedoch eine leere Anweisung sein:
for(int n = 0; n < 10; ++n, printf("%d\n", n)) ; // Null-Anweisung
Wenn die Ausführung der Schleife an einem bestimmten Punkt beendet werden muss, kann eine break-Anweisung an beliebiger Stelle innerhalb der loop-statement verwendet werden.
Die continue-Anweisung wird überall innerhalb der loop-statement verwendet und übergibt die Steuerung an die iteration-expression .
Ein Programm mit einer Endlosschleife hat undefiniertes Verhalten, wenn die Schleife kein beobachtbares Verhalten (E/A, volatile-Zugriffe, atomare oder Synchronisationsoperationen) in irgendeinem Teil ihres cond-expression , iteration-expression oder loop-statement aufweist. Dies ermöglicht es Compilern, alle unbeobachtbaren Schleifen zu optimieren, ohne zu beweisen, dass sie terminieren. Die einzigen Ausnahmen sind Schleifen, bei denen cond-expression weggelassen wird oder ein konstanter Ausdruck ist; for ( ;; ) ist immer eine Endlosschleife.
|
Wie bei allen anderen Auswahl- und Iterationsanweisungen etabliert die for-Anweisung Blockgültigkeitsbereich : Jeder Bezeichner, der in der init-clause , cond-expression oder iteration-expression eingeführt wird, verliert seine Gültigkeit nach der loop-statement . |
(seit C99) |
|
attr-spec-seq
ist eine optionale Liste von
Attributen
, angewendet auf die
|
(seit C23) |
Schlüsselwörter
Hinweise
Der Ausdrucksstatement, der als loop-statement verwendet wird, etabliert seinen eigenen Blockgültigkeitsbereich, getrennt vom Gültigkeitsbereich des init-clause , anders als in C++:
for (int i = 0; ; ) { long i = 1; // gültiges C, ungültiges C++ // ... }
Es ist möglich, in den Rumpf einer Schleife mittels goto einzuspringen. Beim Betreten einer Schleife auf diese Weise werden init-clause und cond-expression nicht ausgeführt. (Falls die Ausführung dann das Ende des Schleifenrumpfs erreicht, kann eine Wiederholung stattfinden, die die Ausführung von cond-expression einschließt.)
Beispiel
Mögliche Ausgabe:
Array filled! 1 0 1 1 1 1 0 0
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 The for statement (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
Siehe auch
|
C++ Dokumentation
für
for
Schleife
|