Switch

Das switch Statement besteht aus einer Aneinanderreihung von Sprungzielen, welche dann den jeweils dafür vorgesehenen Code ausführen:
int x = 2;
switch(x)//(1)
{
case 0://(2)
    std::cout << "Wird bei x == 0 ausgeführt" << std::endl;
    break;//(3)
case 1:
case 3:
    std::cout << "Wird bei x == 1|3 ausgeführt" << std::endl;
case 2://(4)
    std::cout << "Wird bei x == 1|2|3 ausgeführt" << std::endl;
    break;
default://(5)
    std::cout << "x ist nicht 0,1,2,3. Fehler" << std::endl;
}


  1. Das switch Statement benötigt eine Variable, für die der entsprechende Sprungblock generiert werden soll.
  2. Innerhalb des switch Statements gibt das Schlüsselwort case #WERT: die Sprungstellen an. Wie man hinter (3) sieht, kann es auch mehrere davon hintereinander geben. Nach einem oder mehreren case Statements folgt dann der Codeblock für diese.
  3. Das Schlüsselwort break bewirkt das Ende des switch Statements. Die nachfolgenden case Statements und Codeblöcke werden ignoriert.
  4. Fehlt das break Schlüsselwort, so ergibt sich ein Fallthrough-effekt: bei x == 2 springt der switch-case block an die stelle von case 2: und führt nur den darauf folgenden Block aus, bei x == 1 oder 3, wird ebenfalls dieser und der vorherige Codeblock ausgefüllt.
  5. Schließlich gibt es die (optionale) Möglichkeit einen default Block anzugeben, der immer dann ausgeführt wird, wenn alle anderen Bedingungen nicht zu treffen. Dies wird häufig für Fehlerbehandlungen genutzt.

 

Das switch Statement funktioniert in C++ nur mit numerischen Werten bzw. char. Ein switch Statement für Strings gibt es nicht wie in anderen Sprachen. Der Fallthrough in (4) kann durchaus gewollt sein, wenn man zum Beispiel es mit verschiedenen Versionen zu tun hat, kann man so extra Code einbauen. Häufig ist das vergessen des break Kennworts aber auch eine Fehlerquelle. Daher sollte man die bewusste Nutzung des Fallthroughs immer mit einem Kommentar kennzeichnen. Theoretisch ließe sich auch ein switch Statement durch viele if-else Bedingungen ersetzen. Ebenfalls kann man es durch eine map aus Funktoren ersetzen, dann ergibt sich aber kein Fallthrough mehr.