Namespaces
Variants

switch statement

From cppreference.net

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:

switch(1) {
    case 1 : puts("1"); // gibt "1" aus,
    case 2 : puts("2"); // gibt dann "2" aus ("Fall-through")
}
switch(1) {
    case 1 : puts("1"); // gibt "1" aus
             break;     // und beendet den switch
    case 2 : puts("2");
             break;
}

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

Schlüsselwörter

switch , case , default

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