Sprachkonzepte Preprozessor Operatoren Kontrollstrukturen Typen OOP Bibliotheken |
switchDie switch-Struktur erlaubt es, abhängig von einem Dezimalwert eine Fallunterscheidung zu machen. Der zu überprüfende Wert (die Bedingung) steht in runden Klammern () nach dem
Siehe auch case, default, break, Bedingung DetailsDer zu überprüfende Wert wird hier nicht als boolscher Wert aufgefasst, sondern als Dezimalzahl. Es kann sich bei der Bedingung um einen konstanten Wert, eine Variable oder das Ergebnis einer Berechnung handeln, der schlussendliche Wert muss jedoch einen integralen 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 Bedingungsblockes 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 Bedingungsblockes 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-AnweisungEin 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:
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:
Variablendeklaration im UnterscheidungsblockDa 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:
Vorsicht ist jedoch geboten bei Variablendeklarationen mit Initialisierung. Da eine Initialisierung einen ausführbaren Code darstellt, kann es sein, dass durch den Sprung zum korrekten Fall dieser Code übersprungen wird und die Initialisierung nicht stattfindet, was in sinnlosen Werten resultiert:
|