switch statement
Führt Code entsprechend dem Wert eines ganzzahligen Arguments aus.
Wird verwendet, wenn einer oder mehrere von vielen Codezweigen basierend auf einem ganzzahligen Wert ausgeführt werden müssen.
Inhaltsverzeichnis |
Syntax
attr-spec-seq
(optional)
switch (
expression
)
statement
|
|||||||||
| attr-spec-seq | - |
(C23)
optionale Liste von
Attributen
, angewendet auf die
switch
-Anweisung
|
| expression | - | beliebiger Ausdruck vom Ganzzahltyp (char, vorzeichenbehaftete oder vorzeichenlose Ganzzahl oder Aufzählung) |
| statement | - |
beliebige
Anweisung
(typischerweise eine zusammengesetzte Anweisung).
case:
- und
default:
-Labels sind in
statement
erlaubt, und die
break
;
-Anweisung hat besondere Bedeutung.
|
case
constant-expression
:
statement
|
(1) | (bis C23) | |||||||
attr-spec-seq
(optional)
case
constant-expression
:
statement
(optional)
|
(1) | (seit C23) | |||||||
default
:
statement
|
(2) | (bis C23) | |||||||
attr-spec-seq
(optional)
default
:
statement
(optional)
|
(2) | (seit C23) | |||||||
| constant-expression | - | jeder ganzzahlige konstante Ausdruck |
| attr-spec-seq | - | (C23) optionale Liste von Attributen , angewendet auf das Label |
Erklärung
Der Rumpf einer switch-Anweisung kann eine beliebige Anzahl von
case:
-Labels haben, solange die Werte aller
constant-expressions
eindeutig sind (nach
Konvertierung
in den
promoted type
des
expression
). Höchstens ein
default:
-Label darf vorhanden sein (obwohl verschachtelte switch-Anweisungen ihre eigenen
default:
-Labels verwenden oder
case:
-Labels haben können, deren Konstanten mit denen im umschließenden switch identisch sind).
Wenn expression zu einem Wert ausgewertet wird, der nach der Konvertierung in den höhergestellten Typ von expression gleich dem Wert eines der constant-expression s ist, wird die Steuerung an die Anweisung übergeben, die mit dieser constant-expression gekennzeichnet ist.
Falls
expression
einen Wert ergibt, der mit keinem der
case:
-Labels übereinstimmt, und das
default:
-Label vorhanden ist, wird die Steuerung an die mit dem
default:
-Label markierten Anweisung übergeben.
Wenn der
Ausdruck
einen Wert ergibt, der mit keinem der
case:
-Labels übereinstimmt und das
default:
-Label nicht vorhanden ist, wird kein Teil des Switch-Bodys ausgeführt.
Die break -Anweisung beendet, wenn sie irgendwo in statement angetroffen wird, die switch-Anweisung:
|
Wie bei allen anderen Auswahl- und Iterationsanweisungen etabliert die switch-Anweisung einen Blockgültigkeitsbereich : Jeder Bezeichner, der im Ausdruck eingeführt wird, verliert seine Gültigkeit nach der Anweisung .
Falls eine VLA oder ein anderer Bezeichner mit variabel modifiziertem Typ ein
switch (expr) { int i = 4; // not a VLA; OK to declare here f(i); // never called // int a[i]; // error: VLA cannot be declared here case 0: i = 17; default: int a[i]; // OK to declare VLA here printf("%d\n", i); // prints 17 if expr == 0, prints indeterminate value otherwise } |
(seit C99) |
Schlüsselwörter
Beispiel
#include <stdio.h> void func(int x) { printf("func(%d): ", x); switch(x) { case 1: printf("case 1, "); case 2: printf("case 2, "); case 3: printf("case 3.\n"); break; case 4: printf("case 4, "); case 5: case 6: printf("case 5 or case 6, "); default: printf("default.\n"); } } int main(void) { for(int i = 1; i < 9; ++i) func(i); }
Ausgabe:
func(1): case 1, case 2, case 3. func(2): case 2, case 3. func(3): case 3. func(4): case 4, case 5 or case 6, default. func(5): case 5 or case 6, default. func(6): case 5 or case 6, default. func(7): default. func(8): default.
Referenzen
- C17-Standard (ISO/IEC 9899:2018):
-
- 6.8.4.2 Die switch-Anweisung (S: 108-109)
- C11-Standard (ISO/IEC 9899:2011):
-
- 6.8.4.2 Die switch-Anweisung (S: 149-150)
- C99-Standard (ISO/IEC 9899:1999):
-
- 6.8.4.2 Die switch-Anweisung (S: 134-135)
- C89/C90 Standard (ISO/IEC 9899:1990):
-
- 3.6.4.2 Die switch-Anweisung
Siehe auch
|
C++ Dokumentation
für
switch
Anweisung
|