switch

Die switch-Struktur erlaubt es, abhängig von einem Dezimalwert eine Fallunterscheidung zu machen. Der zu überprüfende Wert steht in runden Klammern () nach dem switch-Keyword und der Unterscheidungsblock gleich danach in geschweiften Klammern {}. Innerhalb des Unterscheidungsblocks stehen die verschiedenen Fälle aufgelistet mit Labels, welche durch das Keyword case eingeleitet werden. Unbehandelte Fälle werden optional mit dem spezial-Label default eingeleitet. Um am Ende eines Falls zum Ende des Unterscheidungsblockes zu springen, benötigt man die break-Anweisung.







The value is two.
#include <stdio.h>

int main(){
  int x = 2;
  switch(x){
    case 1:  printf("The value is one.\n");   break;
    case 2:  printf("The value is two.\n");   break;
    case 3:  printf("The value is three.\n"); break;
    default: printf("The value is x.\n");
  }
  return 0;
}

Siehe auch case, default, break

Details

Der zu überprüfende Wert wird hier nicht als boolscher Wert aufgefasst, sondern als Dezimalzahl. Es kann sich bei dem zu überprüfenden Wert um einen konstanten Wert, eine Variable oder das Ergebnis einer Berechnung handeln, der schlussendliche Wert muss jedoch einen Integer-Wert ergeben: signed und unsigned char, short, int und long int. Nicht erlaubt sind Fliesskommazahlen und Pointer sowie Objekte.

Der default-Teil muss nicht zwingendermassen am Schluss des Unterscheidungsblockes stehen, ist jedoch üblich. Die Verwendung des default-Keyword ist optional. Falls der default-Fall nicht ausprogrammiert ist, so wird bei Auftreten eines unbehandelten Falles automatisch ans Ende des Unterscheidungsblockes gesprungen.

Innerhalb einer switch-Struktur müssen die case- und default-Label eindeutig sein. Die definierten Sprungadressen sind jedoch Pseudolabels und haben nur innerhalb der betreffenden switch-Struktur Gültigkeit. In jeder anderen switch-Struktur können wiederum sämtliche case- und default-Labels stehen. Ausserhalb einer switch-Struktur sind diese Labels nicht erlaubt. Die Labels können auch innerhalb der Struktur NICHT mittels der goto-Anweisung angesprungen werden.

Vergessene break-Anweisung

Ein typischer Fehler bei der switch-Struktur ist das Vergessen der break-Anweisung. Ohne diese Anweisung wird der Programmcode nicht zum Ende des Unterscheidungsblockes springen. In folgendem Beispiel wird dies ersichtlich:







The value is two.
The value is three.
The value is x.
#include <stdio.h>

int main(){
  int x = 2;
  switch(x){
    case 1:  printf("The value is one.\n");
    case 2:  printf("The value is two.\n");
    case 3:  printf("The value is three.\n");
    default: printf("The value is x.\n");
  }
  return 0;
}

Dieser Fehler sieht harmlos aus. In der Hitze des Gefechtes kann jedoch die break-Anweisung schnell mal vergessen gehen und seltsame Effekte hervorrufen, was bei ernsten Anwendungen zu mehrstündigen Fehlersuchen führen kann:










value: 100
#include <stdio.h>

int main(){
  int value = 100;
  char letter = '-';
  switch(letter){
    case '-': value--;
    case '+': value++;
  }
  printf("value: %d\n", value);
  return 0;
}

Variablendeklaration im Unterscheidungsblock

Da sämtliche Fälle innerhalb von geschweiften Klammern {} beschrieben werden, ist es möglich, lokale Variablen zu deklarieren, welche ausserhalb nicht sichtbar sind. Folgendes Konstrukt ist also möglich:





x half: 1
  int x = 2;
  switch(x){
    int y;
    case 1:  y = x / 3; printf("x third: %d\n", y); break;
    case 2:  y = x / 2; printf("x half : %d\n", y); break;
  }

Vorsicht ist jedoch geboten bei Variablendefinitionen mit Initialisierung. Der Compiler generiert für eine solche Initialisierung ausführbaren Code, welcher durch den Sprung zum korrekten Fall übersprungen wird, was in sinnlosen Werten resultiert:





y-value: -1073743116
  int x = 2;
  switch(x){
    int y = 4;
    case 1:  printf("y-value: %d\n", y); break;
    case 2:  printf("y-value: %d\n", y); break;
  }