Namespaces
Variants

Statements

From cppreference.net

Anweisungen sind Fragmente des C-Programms, die in Sequenz ausgeführt werden. Der Körper jeder Funktion ist eine zusammengesetzte Anweisung, die wiederum eine Sequenz von Anweisungen und Deklarationen ist:

int main(void)
{ // Beginn eines zusammengesetzten Statements
    int n = 1; // Deklaration (kein Statement)
    n = n+1; // Ausdrucksstatement
    printf("n = %d\n", n); // Ausdrucksstatement
    return 0; // Return-Statement
} // Ende des zusammengesetzten Statements, Ende des Funktionskörpers


Es gibt fünf Arten von Anweisungen:

Eine Attributspezifizierer-Sequenz ( attr-spec-seq ) kann auf eine unmarkierte Anweisung angewendet werden, wobei (außer bei einem Ausdrucksstatement) die Attribute auf die jeweilige Anweisung angewendet werden.

(since C23)

Inhaltsverzeichnis

Labels

Jede Anweisung kann gelabelt werden, indem ein Name gefolgt von einem Doppelpunkt vor der Anweisung selbst angegeben wird.

attr-spec-seq (optional) (seit C23) identifier : (1)
attr-spec-seq (optional) (seit C23) case constant-expression : (2)
attr-spec-seq (optional) (seit C23) default : (3)
1) Ziel für goto .
2) Case-Label in einer switch -Anweisung.
3) Standard-Label in einer switch -Anweisung.

Jede Anweisung (aber keine Deklaration) kann beliebig vielen Labels vorangestellt werden, die jeweils identifier als Labelnamen deklarieren, der innerhalb der umschließenden Funktion eindeutig sein muss (mit anderen Worten, Labelnamen haben Funktionsbereich ).

Die Deklaration eines Labels hat für sich allein keine Auswirkung, ändert nicht den Kontrollfluss und beeinflusst auch nicht das Verhalten der nachfolgenden Anweisung in irgendeiner Weise.

Ein Label muss von einer Anweisung gefolgt werden.

(bis C23)

Ein Label kann ohne folgende Anweisung erscheinen. Wenn ein Label allein in einem Block erscheint, verhält es sich, als ob es von einer Null-Anweisung gefolgt wäre.

Die optionale attr-spec-seq wird auf das Label angewendet.

(seit C23)

Zusammengesetzte Anweisungen

Eine zusammengesetzte Anweisung, oder Block , ist eine in geschweifte Klammern eingeschlossene Folge von Anweisungen und Deklarationen.

{ Anweisung | Deklaration ... (optional) } (bis C23)
Attribut-Spezifizierer-Sequenz (optional) { unmarkierte-Anweisung | Marke | Deklaration ... (optional) } (seit C23)

Die zusammengesetzte Anweisung ermöglicht es, eine Reihe von Deklarationen und Anweisungen zu einer Einheit zusammenzufassen, die überall verwendet werden kann, wo eine einzelne Anweisung erwartet wird (zum Beispiel in einer if -Anweisung oder einer Iterationsanweisung):

if (expr) // Anfang der if-Anweisung
{ // Anfang des Blocks
  int n = 1; // Deklaration
  printf("%d\n", n); // Ausdrucksanweisung
} // Ende des Blocks, Ende der if-Anweisung

Jede zusammengesetzte Anweisung führt ihren eigenen Blockgültigkeitsbereich ein.

Die Initialisierer der Variablen mit automatischer Speicherdauer , die innerhalb eines Blocks deklariert sind, und die VLA-Deklaratoren werden ausgeführt, wenn der Ablaufsteuerung über diese Deklarationen in der Reihenfolge hinweggeht, als wären sie Anweisungen:

int main(void)
{ // Beginn des Blocks
  { // Beginn des Blocks
       puts("hello"); // Ausdrucksanweisung
       int n = printf("abc\n"); // Deklaration, gibt "abc" aus, speichert 4 in n
       int a[n*printf("1\n")]; // Deklaration, gibt "1" aus, alloziert 8*sizeof(int)
       printf("%zu\n", sizeof(a)); // Ausdrucksanweisung
  } // Ende des Blocks, Gültigkeitsbereich von n und a endet
  int n = 7; // n kann wiederverwendet werden
}

Ausdrucksanweisungen

Ein Ausdruck gefolgt von einem Semikolon ist eine Anweisung.

expression (optional) ; (1)
attr-spec-seq expression ; (2) (seit C23)

Die meisten Anweisungen in einem typischen C-Programm sind Ausdrucksanweisungen, wie Zuweisungen oder Funktionsaufrufe.

Ein Ausdrucksstatement ohne Ausdruck wird als null statement bezeichnet. Es wird oft verwendet, um einem for - oder while -Loop einen leeren Rumpf zu geben. Es kann auch verwendet werden, um ein Label am Ende eines Verbundstatements oder vor einer Deklaration zu platzieren:

puts("hello"); // Ausdrucksanweisung
char *s;
while (*s++ != '\0')
    ; // Leere Anweisung

Die optionale attr-spec-seq wird auf den Ausdruck angewendet.

Eine attr-spec-seq gefolgt von ; bildet keinen Ausdrucksstatement. Sie bildet stattdessen eine Attributdeklaration .

(seit C23)

Auswahlanweisungen

Die Auswahlanweisungen wählen zwischen einer von mehreren Anweisungen abhängig vom Wert eines Ausdrucks.

attr-spec-seq (optional) (since C23) if ( expression ) statement (1)
attr-spec-seq (optional) (since C23) if ( expression ) statement else statement (2)
attr-spec-seq (optional) (since C23) switch ( expression ) statement (3)
1) if Anweisung
2) if Anweisung mit einer else-Klausel
3) switch Anweisung

Iterationsanweisungen

Die Iterationsanweisungen führen eine Anweisung wiederholt aus.

attr-spec-seq (optional) (since C23) while ( expression ) statement (1)
attr-spec-seq (optional) (since C23) do statement while ( expression ) ; (2)
attr-spec-seq (optional) (since C23) for ( init-clause ; expression (optional) ; expression (optional) ) statement (3)
1) while Schleife
2) do-while Schleife
3) for Schleife

Sprunganweisungen

Die Sprunganweisungen übertragen die Ablaufsteuerung bedingungslos.

attr-spec-seq (optional) (since C23) break ; (1)
attr-spec-seq (optional) (since C23) continue ; (2)
attr-spec-seq (optional) (since C23) return expression (optional) ; (3)
attr-spec-seq (optional) (since C23) goto identifier ; (4)
1) break Anweisung
2) continue Anweisung
3) return Anweisung mit einem optionalen Ausdruck
4) goto Anweisung

Referenzen

  • C23-Standard (ISO/IEC 9899:2024):
  • 6.8 Statements and blocks (S: TBD)
  • C17-Standard (ISO/IEC 9899:2018):
  • 6.8 Anweisungen und Blöcke (S: 106-112)
  • C11-Standard (ISO/IEC 9899:2011):
  • 6.8 Statements and blocks (S. 146-154)
  • C99-Standard (ISO/IEC 9899:1999):
  • 6.8 Anweisungen und Blöcke (S: 131-139)
  • C89/C90-Standard (ISO/IEC 9899:1990):
  • 3.6 STATEMENTS

Siehe auch

C++ Dokumentation für Statements