Namensräume
Varianten
Aktionen

for Schleife

Von cppreference.com
< c‎ | Sprache

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.
  • Ein init-clause, der eine Deklaration ist, ist im gesamten Schleifenkörper gültig, einschließlich des Rests von init-clause, des gesamten cond-expression, des gesamten iteration-expression und des gesamten loop-statement. Nur die Speicherdauer-Spezifizierer auto und register 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 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 for-Anweisung angewendet werden.

(seit C23)

[bearbeiten] Schlüsselwörter

for

[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

#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

[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