C++ Kurs

switch-Verzweigung

Die Themen:

Syntax

Sollen je nach Inhalt einer ganzzahligen Variable verschiedene Anweisungen durchlaufen werden, so kann dies, wie nachfolgend dargestellt, durch entsprechend geschachtelte if-else Anweisungen erfolgen. Im Beispiel werden je nach Inhalt der Variable var die Anweisungen AKTION1, AKTION2 oder AKTION3 ausgeführt. Enthält var einen anderen Wert als 1,2 oder 3, so werden die Anweisungen AKTION4 ausgeführt.


if (var == 1)
   {AKTION1}
else if (var == 2)
   {AKTION2}
else if (var == 3)
   {AKTION3}
else
   {AKTION4}

Anstelle einer solchen geschachtelten if-else Anweisung kann, und sollte, jedoch die switch-Verzweigung eingesetzt werden. Sie hat folgende Syntax:

switch (AUSDRUCK)
{
case K1:
   AKTION1
   [break;]
case K2:
   AKTION2
   [break;]
...
case Kx:
   AKTIONx
   [break;]
[default:
   AKTIONy]
}

Die nach dem Schlüsselwort case stehenden Kx müssen ganzzahlige oder char-Konstanten sein. Der Ausdruck in der switch-Anweisung muss in runden Klammern stehen und nach dem Ausdruck folgt immer ein Block {....}. Die in eckigen Klammern stehenden Anweisungen sind optional.

Ablauf der Verzweigung

Der Ablauf der switch-Verzweigung ist nun Folgender:

  1. Zuerst wird der Ausdruck der switch-Anweisung ausgewertet. Dieser Ausdruck muss entweder ein ganzzahliges oder char-Ergebnis liefern; Gleitkomma-Ausdrücke sind hier nicht erlaubt!
  2. Danach wird das Ergebnis des Ausdrucks mit den Literalen/Konstanten verglichen, die auf die Schlüsselwörter case folgen. Stimmt das Ergebnis mit einem der angegebenen Werte überein, so werden die Anweisungen nach der entsprechenden case-Anweisung ausgeführt.
  3. Stimmt das Ergebnis mit keinem der aufgeführten Werte überein, so werden die Anweisungen nach der default-Anweisung ausgeführt.

Das nachfolgende Beispiel entspricht damit der am Anfang dargestellten verschachtelten if-else Anweisung.


switch (var)
{
case 1:
   Aktion1
   break;
case 2:
   Aktion2
   break;
case 3:
   Aktion3
   break;
default:
   Aktion4
}
....

Der default-Zweig ist optional, d.h. er muss nicht zwingend vorhanden sein. Fehlt der default-Zweig und ergibt die Auswertung des switch-Ausdrucks keine Übereinstimmung mit einem der aufgeführten case-Werte, so wird keine Aktion ausgeführt und es geht mit der nächsten Anweisung weiter, die nach der geschweiften Klammer zu des switch-Blocks folgt.

break Anweisung

Die break-Anweisung innerhalb eines switch-Blocks bewirkt ein unmittelbares Verlassen des Blocks, d.h. nach dem break wird als nächste die Anweisung ausgeführt, die nach der geschweiften Klammer zu folgt. Ohne eine break-Anweisung werden alle nach der Einsprungsmarke (case Kx:) folgenden Anweisungen bis zum Ende des switch-Blocks oder bis zum Erreichen eines break ausführt.


// SWITCH-CASE mit break-Anweisung
int var = 2;
...
switch (var)
{
case 1:
   cout << "Variable gleich 1\n";
   break;
case 2:
   cout << "Variable gleich 2\n";
   break;
case 3:
   cout << "Variable gleich 3\n";
   break;
default:
   cout << "Variable weder 1,2 noch 3\n";
}
Programmausgabe Variable gleich 2

// SWITCH-CASE ohne break-Anweisung
int var = 2;
....
switch (var)
{
case 1:
   cout << "Variable gleich 1\n";
case 2:
   cout << "Variable gleich 2\n";
case 3:
   cout << "Variable gleich 3\n";
default:
   cout << "Variable weder 1,2 noch 3\n";
}
Programmausgabe Variable gleich 2
 Variable gleich 3
 Variable weder 1,2 noch 3

Aktionen im case-Zweig

Die innerhalb eines case-Zweigs stehende Aktion kann aus mehreren Anweisungen bestehen. Eine Blockung {...}, wie bei der if-Anweisung, ist hier nicht notwendig. Innerhalb eines case-Zweigs können beliebige C++ Anweisung stehen mit einer Ausnahme: es dürfen hier ohne besondere Vorkehrung keine Variablen definiert werden! Sollen innerhalb eines case-Zweigs Variablen definiert werden, so muss dies in einem entsprechenden Block {....} erfolgen damit die Lebensdauer der Variablen definiert ist.

Und auch das ist möglich: sollen für verschiedene Werte die gleichen Anweisungen ausgeführt werden, so können mehrere case-Zweige unmittelbar aufeinander folgen. Die Reihenfolge der case-Anweisungen ist dabei beliebig, d.h. sie müssen nicht in sortierter Reihenfolge angegeben werden.


char alpha;
...
switch (alpha)
{
case 'e':
case 'E':
   Aktion1;
   break;
case 'a':
case 'A':
   Aktion2;
}

Im Beispiel wird eine char-Variable alpha ausgewertet. Und unabhängig davon, ob ein e oder a als Groß- oder Kleinbuchstabe in der Variable abgelegt ist, es wird immer die gleiche Aktion ausgeführt.

Sie können übrigens mit Hilfe der Bibliotheksfunktionen
int std::toupper(int toConvert);
int std::tolower(int toConvert);

Kleinbuchstaben in Großbuchstaben umwandeln und umgekehrt. Der umzuwandelnde Buchstabe wird als int-Wert übergeben. Beide Funktionen liefern als Returnwert den entsprechenden gewandelten Buchstaben. Handelt es sich beim übergebenen Wert nicht um einen Buchstaben sondern z.B. um die ASCII-Zahl '9', so wird der Originalwert zurückgeliefert. Die Funktion ist in der Header-Datei cctype deklariert, die Sie dann auch einbinden müssen.

Beispiel und Übung Und hier geht's zum Beispiel und zur Übung.