Namensräume
Varianten
Aktionen

do-while Schleife

Von cppreference.com
< c‎ | Sprache

Führt eine Anweisung wiederholt aus, bis der Wert des Bedingungs-Ausdrucks falsch wird. Die Prüfung erfolgt nach jeder Iteration.

Inhalt

[bearbeiten] Syntax

attr-spec-seq(optional) do Anweisung while ( Ausdruck ) ;
expression - Beliebiger Ausdruck vom skalaren Typ. Dieser Ausdruck wird nach jeder Iteration ausgewertet, und wenn er gleich Null ist, wird die Schleife beendet.
Anweisung - Beliebige Anweisung, typischerweise eine zusammengesetzte Anweisung, die den Körper der Schleife bildet
attr-spec-seq - (C23) Optionale Liste von Attributen, angewendet auf die Schleifenanweisung

[bearbeiten] Erklärung

Eine do-while-Anweisung bewirkt, dass die Anweisung (auch Schleifenkörper genannt) wiederholt ausgeführt wird, bis der Ausdruck (auch steuernder Ausdruck genannt) gleich 0 ist. Die Wiederholung erfolgt unabhängig davon, ob der Schleifenkörper normal oder durch ein goto in die Mitte der Anweisung betreten wird.

Die Auswertung des Ausdrucks erfolgt nach jeder Ausführung der Anweisung (unabhängig davon, ob sie normal oder durch einen goto betreten wurde). Wenn der steuernde Ausdruck vor dem Schleifenkörper ausgewertet werden muss, können die while-Schleife oder die for-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 in keinem Teil ihrer Anweisung oder ihres Ausdrucks ein beobachtbares Verhalten (I/O, volatile Zugriffe, atomare oder Synchronisationsoperation) aufweist. Dies ermöglicht es den Compilern, alle nicht beobachtbaren Schleifen zu optimieren, ohne zu beweisen, dass sie terminieren. Die einzigen Ausnahmen sind Schleifen, bei denen der Ausdruck ein konstanter Ausdruck ist; do {...} while(true); ist immer eine Endlosschleife.

Wie alle anderen Auswahl- und Iterationsanweisungen etabliert die do-while-Anweisung einen Block-Scope: Jeder Bezeichner, der im Ausdruck eingeführt wird, gerät nach der Anweisung aus dem Gültigkeitsbereich.

(seit C99)

[bearbeiten] Anmerkungen

Boolesche und Zeigerausdrücke werden oft als schleifensteuernde Ausdrücke verwendet. Der boolesche Wert false und der Nullzeigerwert eines beliebigen Zeigertyps werden gleich Null verglichen.

[bearbeiten] Schlüsselwörter

do, while

[bearbeiten] Beispiel

#include <stdio.h>
#include <stdlib.h>
enum { SIZE = 8 };
int main(void)
{
    // trivial example
    int array[SIZE], n = 0;
    do array[n++] = rand() % 2; // the loop body is a single expression statement
    while(n < SIZE);
    puts("Array filled!");
    n = 0;
    do { // the loop body is a compound statement
        printf("%d ", array[n]);
        ++n;
    } while (n < SIZE);
    printf("\n");
 
    // the loop from K&R itoa(). The do-while loop is used
    // because there is always at least one digit to generate
    int num = 1234, i=0;
    char s[10];
    do s[i++] = num % 10 + '0'; // get next digit in reverse order
    while ((num /= 10) > 0);
    s[i] = '\0';
    puts(s);
}

Mögliche Ausgabe

Array filled!
1 0 1 1 1 1 0 0
4321

[bearbeiten] Referenzen

  • C17-Standard (ISO/IEC 9899:2018)
  • 6.8.5.2 Die do-Anweisung (S. 109)
  • C11-Standard (ISO/IEC 9899:2011)
  • 6.8.5.2 Die do-Anweisung (S. 151)
  • C99-Standard (ISO/IEC 9899:1999)
  • 6.8.5.2 Die do-Anweisung (S. 136)
  • C89/C90-Standard (ISO/IEC 9899:1990)
  • 3.6.5.2 Die do-Anweisung

[bearbeiten] Siehe auch

C++ Dokumentation für do-while Schleife