switch-Anweisung
Führt Code gemäß 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.
Inhalt |
[bearbeiten] Syntax
attr-spec-seq(optional) switch ( expression ) statement |
|||||||||
| attr-spec-seq | - | (C23)optionale Liste von Attributen, angewendet auf die switch-Anweisung |
| expression | - | ein beliebiger Ausdruck vom Ganzzahltyp (char, vorzeichenbehaftete oder vorzeichenlose Ganzzahl oder Enumeration) |
| Anweisung | - | eine beliebige Anweisung (typischerweise eine zusammengesetzte Anweisung). case: und default: Labels sind in statement erlaubt, und die break;-Anweisung hat eine 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) | |||||||
| konstanter Ausdruck | - | ein beliebiger konstanter Ausdruck des ganzzahligen Typs |
| attr-spec-seq | - | (C23)optionale Liste von Attributen, angewendet auf das Label |
[bearbeiten] Erklärung
Der Körper einer switch-Anweisung kann eine beliebige Anzahl von case:-Labels haben, solange die Werte aller constant-expressions eindeutig sind (nach Konvertierung in den promotions-Typ des expression). Höchstens ein default:-Label darf vorhanden sein (obwohl verschachtelte switch-Anweisungen ihre eigenen default:-Labels verwenden oder case:-Labels haben dürfen, deren Konstanten identisch mit denen der umschließenden switch sind).
Wenn expression den Wert auswertet, der nach Konvertierung in den promotions-Typ von expression mit dem Wert eines der constant-expressions übereinstimmt, wird die Kontrolle an die Anweisung übertragen, die mit diesem constant-expression gekennzeichnet ist.
Wenn expression einen Wert auswertet, der keinem der case:-Labels entspricht, und das default:-Label vorhanden ist, wird die Kontrolle an die Anweisung übertragen, die mit dem default:-Label gekennzeichnet ist.
Wenn expression einen Wert auswertet, der keinem der case:-Labels entspricht, und das default:-Label nicht vorhanden ist, wird keiner der switch-Körper ausgeführt.
Die break-Anweisung beendet die switch-Anweisung, wenn sie irgendwo in statement angetroffen wird.
|
Wie bei allen anderen Selektions- und Iterationsanweisungen legt die switch-Anweisung einen Blockumfang fest: Jeder im expression eingeführte Bezeichner tritt nach der statement außer Reichweite. Wenn ein VLA oder ein anderer Bezeichner mit variablentyp-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) |
[bearbeiten] Schlüsselwörter
[bearbeiten] 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.
[bearbeiten] 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
[bearbeiten] Siehe auch
| C++ Dokumentation für
switch-Anweisung |