20. Selektion II: switch

Das switch-Statement erlaubt eine Fallunterscheidung nach konstanten Werten. Allgemein hat es die Form:

switchStatement ::= "switch" "(" integerExpression ")" "{" {caseExpression }"}"
caseExpression ::= "case" constantLabel ":" {statement } | "default" ":" {statement }

Dabei wird die integerExpression ausgewertet und dann gegen jedes constantLabel verglichen, bis eine Übereinstimmung gefunden wird; dann wird die Ausführung dort fortgesetzt, bis ein break gefunden wird. Hat keiner der der constantLabels der Wert der integerExpression, wird zum default-Label gesprungen.

Beispiel:

switch(ch) {
  case 'o':
    openDoor();
    break;
  case 'c':
    closeDoor();
    break;
  default:
    fprintf(stderr, "Unknown command\n");
}

Python hat kein switch-Statement. Wenn man so etwas braucht, ist es nicht schwer, es durch eine Folge von if...elif-Statements zu ersetzen.

Das Beispiel oben könnte etwa so aussehen:

if ch=='o':   # case 'o':
  openDoor()
elif ch=='c': # case 'c':
  closeDoor()
else:         # default:
  sys.stderr.write("Unknown command\n")

In der Tat ist dieses Konstrukt (das ganz ähnlich auch in C verwendet werden kann) flexibler als switch (lädt damit aber natürlich auch zu mehr Missbrauch ein), das mit switch keine Bedingungen wie “ch zwischen ‘a‘ und ‘z‘” oder gar “Funktion isascii(ch) ist wahr” geprüft werden können.

Für das erste Problem gibt es übrigens eine Erweiterung von GNU C. Der GNU C-Compiler versteht Dinge wie

case 'a' ... 'z':
  foo();

Ob ihr sowas verwenden wollt, ist fraglich. Erstens reduziert ihr damit die Portabilität eures Programms, d.h., es wird schwieriger, es ohne den gcc zum Laufen zu bekommen. Angesichts des Umstands, dass es den gcc eigentlich auf allen Rechnern gibt, die man überhaupt ansehen will, ist das vielleicht kein so großes Problem – vor allem aber will man Zeichenklassifikation gewiss nicht so machen.

Vorsicht Falle: Die Ausführung wird beim ersten passenden Label fortgesetzt und geht bis zum ersten break. Steht am Ende einer caseExpression kein break, “fällt” die Ausführung zum nächsten Zweig durch. Klassischer Fehler:

switch(ch) {
  case 'a': printf("a");break;
  case 'b': printf("b");
  default: printf("Fehler");
}

Hier wird auch bei jedem b “Fehler” ausgegeben.


Markus Demleitner

Copyright Notice