Namespaces
Variants

for loop

From cppreference.net

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.
  • Eine Init-Klausel , die eine Deklaration ist, befindet sich im Gültigkeitsbereich des gesamten Schleifenkörpers, einschließlich des Rests der Init-Klausel , der gesamten Bedingungs-Expression , der gesamten Iterations-Expression und des gesamten Schleifen-Statements . Nur auto und register Speicherklassenspezifizierer sind für die in dieser Deklaration deklarierten Variablen zulässig.
(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 for -Anweisung.

(seit C23)

Schlüsselwörter

for

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

#include <stdio.h>
#include <stdlib.h>
enum { SIZE = 8 };
int main(void)
{
    int array[SIZE];
    for(size_t i = 0 ; i < SIZE; ++i)
        array [i] = rand() % 2;
    printf("Array filled!\n");
    for (size_t i = 0; i < SIZE; ++i)
        printf("%d ", array[i]);
    putchar('\n');
}

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