Namensräume
Varianten
Aktionen

Anweisungen

Von cppreference.com
< c‎ | Sprache

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

int main(void)
{ // start of a compound statement
    int n = 1; // declaration (not a statement)
    n = n+1; // expression statement
    printf("n = %d\n", n); // expression statement
    return 0; // return statement
} // end of compound statement, end of function body


Es gibt fünf Arten von Anweisungen

Eine Attributspezifikatorsequenz (attr-spec-seq) kann auf eine unbeschriftete Anweisung angewendet werden, in welchem Fall (mit Ausnahme einer Ausdrucksanweisung) die Attribute auf die jeweilige Anweisung angewendet werden.

(seit C23)

Inhalt

[bearbeiten] Labels

Jede Anweisung kann mit einem Label versehen 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) Default-Label in einer switch-Anweisung.

Jede Anweisung (aber keine Deklaration) kann von einer beliebigen Anzahl von Labels vorangestellt werden, wobei jedes Label identifier als Lablenamen deklariert und innerhalb der umschließenden Funktion eindeutig sein muss (mit anderen Worten, Lablenamen haben Funktions-Scope).

Eine Label-Deklaration hat keine eigene Wirkung, verändert nicht den Kontrollfluss und modifiziert das Verhalten der folgenden Anweisung in keiner Weise.

Ein Label muss von einer Anweisung gefolgt werden.

(bis C23)

Ein Label kann ohne seine folgende Anweisung erscheinen. Wenn ein Label allein in einem Block steht, verhält es sich so, als würde ihm eine Null-Anweisung folgen.

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

(seit C23)

[bearbeiten] Zusammengesetzte Anweisungen

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

{ statement | declaration...(optional) } (bis C23)
attr-spec-seq(optional) { unlabeled-statement | label | declaration...(optional) } (seit C23)

Die zusammengesetzte Anweisung ermöglicht es, eine Gruppe von Deklarationen und Anweisungen zu einer Einheit zusammenzufassen, die überall dort verwendet werden kann, wo eine einzelne Anweisung erwartet wird (z. B. in einer if-Anweisung oder einer Iterationsanweisung).

if (expr) // start of if-statement
{ // start of block
  int n = 1; // declaration
  printf("%d\n", n); // expression statement
} // end of block, end of if-statement

Jede zusammengesetzte Anweisung führt ihren eigenen Block-Scope ein.

Die Initialisierer der Variablen mit automatischer Speicherdauer, die innerhalb eines Blocks deklariert wurden, und die VLA-Deklaratoren werden ausgeführt, wenn der Kontrollfluss nacheinander über diese Deklarationen fließt, als ob sie Anweisungen wären.

int main(void)
{ // start of block
  { // start of block
       puts("hello"); // expression statement
       int n = printf("abc\n"); // declaration, prints "abc", stores 4 in n
       int a[n*printf("1\n")]; // declaration, prints "1", allocates 8*sizeof(int)
       printf("%zu\n", sizeof(a)); // expression statement
  } // end of block, scope of n and a ends
  int n = 7; // n can be reused
}

[bearbeiten] 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 z. B. Zuweisungen oder Funktionsaufrufe.

Eine Ausdrucksanweisung ohne Ausdruck wird als Null-Anweisung bezeichnet. Sie wird oft verwendet, um einen leeren Körper für eine for- oder while-Schleife bereitzustellen. Sie kann auch verwendet werden, um ein Label am Ende einer zusammengesetzten Anweisung oder vor einer Deklaration zu tragen.

puts("hello"); // expression statement
char *s;
while (*s++ != '\0')
    ; // null statement

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

Eine attr-spec-seq gefolgt von ; bildet keine Ausdrucksanweisung. Stattdessen bildet sie eine Attributdeklaration.

(seit C23)

[bearbeiten] Auswahlanweisungen

Die Auswahlanweisungen wählen je nach Wert eines Ausdrucks zwischen einer von mehreren Anweisungen.

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

[bearbeiten] Iterationsanweisungen

Die Iterationsanweisungen führen eine Anweisung wiederholt aus.

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

[bearbeiten] Sprunganweisungen

Die Sprunganweisungen übertragen den Kontrollfluss bedingungslos.

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

[bearbeiten] Referenzen

  • C23-Standard (ISO/IEC 9899:2024)
  • 6.8 Statements and blocks (S. TBD)
  • C17-Standard (ISO/IEC 9899:2018)
  • 6.8 Statements and blocks (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 Statements and blocks (S. 131-139)
  • C89/C90-Standard (ISO/IEC 9899:1990)
  • 3.6 STATEMENTS

[bearbeiten] Siehe auch

C++-Dokumentation für Anweisungen