case

Das case-Keyword dient bei einer switch-Struktur dazu, ein Label für einen bestimmten Fall der switch-Bedingung mittels einer eindeutigen Sprungadresse zu kennzeichnen. Dabei steht der zu behandelnde Fall einfach nach dem case-Keyword. Da es sich bei einer case-Angabe um ein (Pseudo-)Label handelt, wird die Angabe mit einem Kolon : abgeschlossen.

#include <stdio.h> int main(){ char c = 65; switch(c){ case 0x40: printf("%c is an @.\n", c); break; case 65 : printf("%c is an A.\n", c); break; case 'B' : printf("%c is a B.\n", c); break; default: printf("The character is %c.\n", c); } return 0; }

A is an A.

Siehe auch switch, default, break

Details

Wie im obigen Beispiel zu sehen ist, kann der Wert des behandelten Falls beliebig angegeben werden, solange er eine Dezimalzahl darstellt. Erlaubt sind somit: Integralzahlen, Hexadezimalzahlen, Oktalzahlen, ASCII-Characters in einfachen 'Anführungszeichen' und jegliche konstante Anweisungen (keine Funktionen, keine Variablen), die zu einem integralen Wert evaluieren. Folgendes sind einige Beispiele:

case 0103 : printf("%c is a C.\n", c); break; case (30 + 38) : printf("%c is a D.\n", c); break; case (int)69.0 : printf("%c is an E.\n", c); break;

Die verschiedenen Fälle müssen innerhalb derselben switch-Struktur eindeutig sein. Die durch das Keyword 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-Labels stehen. Ausserhalb einer switch-Struktur ist ein case-Label nicht erlaubt. Die case-Labels können auch innerhalb der Struktur NICHT mittels der goto-Anweisung angesprungen werden.

Man beachte, dass nicht sämtliche Fälle durch case-Keywords beschrieben werden müssen und dass auch nicht sämtliche beschriebenen Fälle im laufenden Programm tatsächlich angesprungen werden. Dies ist im Grunde genommen logisch, sei hier aber einfach bemerkt.

Am Ende eines Falles, beziehungsweise vor Beginn des nächsten Falles muss sehr häufig (aber nicht zwingend) die break-Anweisung stehen, welche nach der Behandlung des Falles zum Ende der switch-Struktur springt. Diese Anweisung kann leicht vergessen gehen und führt zu schwer auffindbaren Fehlern, da ohne diesen Sprung die Anweisungen des nächsten Falles ebenfalls ausgeführt werden.

Mehrere Fälle

In anderen Sprachen ist es teilweise möglich beispielsweise eine Angabe wie case 1 to 5: zu schreiben, welche die Fälle 1 bis 5 gleichzeitig behandelt. In C und C++ ist dies nicht möglich, auch eine Auflistung wie case 1, 2, 3, 4, 5: ergibt Syntax-Fehler. In C oder C++ kann dies nur mit folgenden Zeilen erreicht werden:

case 1: case 2: case 3: case 4: case 5: printf("All 5 cases.\n"); break;

Hierzu die Erklärung: Da das case-Keyword grundsätzlich nur ein Label, also eine Sprungadresse definiert, werden durch die fünf aufeinanderfolgenden case-Statements fünf Sprungadressen für die fünf Fälle definiert, welche alle auf dieselbe Codezeile zeigen. Wichtig ist dabei, dass zwischen den case-Statements kein Code, insbesondere keine break-Anweisung steht.

Diese Methode scheint umständlich, es gibt jedoch Fälle, wo genau dieses Verfahren angewendet wird. Beispielsweise, wenn man bei einem Eingabewert überprüfen will, um welchen Buchstaben es sich handelt, und wenn es keine Rolle spielt, ob er gross oder klein geschrieben ist:

case 'a': case 'A': printf("You pressed the A-Key.\n"); break;

Falls man grosse Intervalle prüfen muss und nicht sämtliche darin enthaltenen Fälle aufschreiben will, so empfielt es sich, anstelle der switch-Struktur eine if-Struktur für diesen speziellen Fall zu programmieren.