Namensräume
Varianten
Aktionen

switch-Anweisung

Von cppreference.com
< c‎ | Sprache

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.

switch(1) {
    case 1 : puts("1"); // prints "1",
    case 2 : puts("2"); // then prints "2" ("fall-through")
}
switch(1) {
    case 1 : puts("1"); // prints "1"
             break;     // and exits the switch
    case 2 : puts("2");
             break;
}

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 case:- oder ein default:-Label innerhalb seines Gültigkeitsbereichs hat, muss die gesamte switch-Anweisung in seinem Gültigkeitsbereich liegen (mit anderen Worten, ein VLA muss entweder vor der gesamten switch oder nach dem letzten Label deklariert werden).

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

switch, case, default

[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