switch
-Anweisung (C)
Die Anweisungen switch
und case
helfen beim Steuern von komplexen bedingten Vorgängen und Branchvorgängen. Mit der switch
-Anweisung wird die Steuerung an eine Anweisung innerhalb des Texts übergeben.
Syntax
selection-statement
:
switch (
expression
)
statement
labeled-statement
:
case
constant-expression
:
statement
default
:
statement
Hinweise
Eine switch
-Anweisung bewirkt, dass die Steuerung abhängig vom Wert auf eine expression
labeled-statement
im Anweisungstext übertragen wird.
Die Werte von expression
und jedem constant-expression
müssen einen integralen Typ aufweisen. Ein constant-expression
muss zur Kompilierzeit einen eindeutigen und konstanten Integralwert aufweisen.
Die Steuerung wird an die case
-Anweisung übertragen, deren constant-expression
-Wert mit dem Wert von expression
übereinstimmt. Die switch
-Anweisung kann eine beliebige Anzahl von case
-Instanzen enthalten. Es können jedoch keine zwei constant-expression
-Werte innerhalb derselben switch
-Anweisung denselben Wert aufweisen. Die Ausführung des switch
-Anweisungstexts beginnt bei der ersten Anweisung in oder nach der passenden labeled-statement
. Die Ausführung verläuft bis zum Ende des Texts oder bis eine break
-Anweisung die Steuerung aus dem Text überträgt.
Die Verwendung der switch
-Anweisung sieht in etwa folgendermaßen aus:
switch ( expression )
{
// declarations
// . . .
case constant_expression:
// statements executed if the expression equals the
// value of this constant_expression
break;
default:
// statements executed if expression does not equal
// any case constant_expression
}
Sie können mit der break
-Anweisung die Verarbeitung einer bestimmten Anweisung mit Bezeichnung innerhalb der switch
-Anweisung beenden. Sie verzweigt sich bis zum Ende der switch
-Anweisung. Ohne break
wird das Programm mit der nächsten Anweisung mit Bezeichnung fortgesetzt, und die Anweisungen werden bis zu einer break
-Anweisung oder dem Ende der Anweisung ausgeführt. Diese Fortsetzung kann in einigen Situationen wünschenswert sein.
Die default
-Anweisung wird ausgeführt, wenn kein case
constant-expression
-Wert mit dem Wert von expression
übereinstimmt. Wenn keine default
-Anweisung vorhanden ist und keine case
-Übereinstimmung gefunden wird, wird keine der Anweisungen im switch
-Text ausgeführt. Es kann höchstens eine default
-Anweisung geben. Die default
-Anweisung muss nicht am Ende stehen. Sie kann an beliebiger Stelle im Text der switch
-Anweisung auftauchen. Eine case
- oder default
-Bezeichnung kann nur innerhalb einer switch
-Anweisung erscheinen.
Der Typ von switch
expression
und case
constant-expression
muss integral sein. Der Wert von jedem case
constant-expression
muss innerhalb des Anweisungstexts eindeutig sein.
Die case
- und default
-Bezeichnungen des switch
-Anweisungstexts sind nur im ersten Test wichtig, in dem bestimmt wird, an welcher Stelle des Anweisungstexts die Ausführung beginnt. switch
-Anweisungen können geschachtelt werden. Alle statischen Variablen werden vor dem Ausführen in einer switch
-Anweisung initialisiert.
Hinweis
Deklarationen können am Anfang der Verbundanweisung stehen, die den switch
-Text bildet, aber in den Deklarationen enthaltene Initialisierungen werden nicht ausgeführt. Mit der switch
-Anweisung wird die Steuerung direkt an eine ausführbare Anweisung innerhalb des Texts übertragen. Dabei werden die Zeilen umgangen, die Initialisierungen enthalten.
In den folgenden Beispielen werden switch
-Anweisungen veranschaulicht:
switch( c )
{
case 'A':
capital_a++;
case 'a':
letter_a++;
default :
total++;
}
Alle drei Anweisungen des switch
-Texts in diesem Beispiel werden ausgeführt, wenn c
gleich 'A'
ist, da vor der folgenden -Anweisung keine case
break
-Anweisung steht. Die Ausführungssteuerung wird auf die erste Anweisung (capital_a++;
) übertragen und im verbleibenden Text der Reihe nach fortgeführt. Wenn c
gleich 'a'
ist, werden letter_a
und total
erhöht. Wenn c
nicht mit 'A'
oder 'a'
übereinstimmt, wird nur total
inkrementiert.
switch( i )
{
case -1:
n++;
break;
case 0 :
z++;
break;
case 1 :
p++;
break;
}
In diesem Beispiel folgt eine break
-Anweisung auf jede Anweisung des switch
-Texts. Die break
-Anweisung erzwingt eine Beendigung vom Anweisungstext, nachdem eine Anweisung ausgeführt wurde. Wenn i
gleich -1 ist, wird nur n
inkrementiert. Die break
-Anweisung, die auf die n++;
-Anweisung folgt, führt dazu, dass die Ausführungssteuerung aus dem Anweisungstext übergeben wird und die übrigen Anweisungen übersprungen werden. Wenn i
gleich 0 ist, wird dementsprechend nur z
erhöht. Wenn i
gleich 1 ist, wird nur p
erhöht. Die abschließende break
-Anweisung ist nicht unbedingt erforderlich, da die Steuerung am Ende der Verbundanweisung aus dem Text übergeben wird. Aus Konsistenzgründen ist sie jedoch enthalten.
Eine einzelne Anweisung kann wie das folgende Beispiel zeigt mehrere case
-Bezeichnungen tragen:
switch( c )
{
case 'a' :
case 'b' :
case 'c' :
case 'd' :
case 'e' :
case 'f' : convert_hex(c);
}
In diesem Beispiel wird im Fall, dass constant-expression
einem beliebigen Buchstaben zwischen 'a'
und 'f'
entspricht, die convert_hex
-Funktion aufgerufen.
Microsoft-spezifisch
In Microsoft C wird die Anzahl von case
-Werten in einer switch
-Anweisung nicht beschränkt. Die Anzahl wird nur durch den verfügbaren Speicher beschränkt. ANSI C erfordert, dass mindestens 257 case
-Abschnitte in einer switch
-Anweisung zulässig sind.
Bei Microsoft C sind die Microsoft-Erweiterungen in der default-Einstellung aktiviert. Verwenden Sie die /Za-Compileroption, um diese Erweiterungen zu deaktivieren.