switch
-Anweisung (C++)
Ermöglicht die Auswahl von mehreren Codeabschnitten, abhängig vom Wert eines ganzzahligen Ausdrucks.
Syntax
selection-statement
:
switch
(
init-statement
optC++17condition
)
statement
init-statement
:
expression-statement
simple-declaration
condition
:
expression
attribute-specifier-seq
optdecl-specifier-seq
declarator
brace-or-equal-initializer
labeled-statement
:
case
constant-expression
:
statement
default
:
statement
Hinweise
Eine switch
-Anweisung bewirkt, dass die Steuerung abhängig vom Wert auf eine condition
labeled-statement
im Anweisungstext übertragen wird.
Der condition
Typ muss einen integralen Typ aufweisen oder ein Klassentyp sein, der eine eindeutige Umwandlung in einen integralen Typ aufweist. Die integrale Heraufstufung erfolgt wie in den Standardkonvertierungen beschrieben.
Der Anweisungstext switch
besteht aus einer Reihe von case
Bezeichnungen und einer optionalen default
Bezeichnung. A labeled-statement
ist eine dieser Bezeichnungen und die folgenden Anweisungen. Die beschrifteten Anweisungen sind keine syntaktischen Anforderungen, aber die switch
Anweisung ist ohne sie bedeutungslos. Es können keine zwei constant-expression
Werte in case
Anweisungen auf denselben Wert ausgewertet werden. Die default
Bezeichnung kann nur einmal angezeigt werden. Die default
Anweisung wird häufig am Ende platziert, kann aber an einer beliebigen Stelle im Textkörper der switch
Anweisung angezeigt werden. Eine case
- oder default
-Bezeichnung kann nur innerhalb einer switch
-Anweisung erscheinen.
Die constant-expression
einzelnen case
Bezeichnungen werden in einen Konstantenwert konvertiert, der denselben Typ wie condition
. Dann wird es mit condition
der Gleichheit verglichen. Control wird an die erste Anweisung nach dem Wert übergeben, der case
constant-expression
dem Wert entspricht condition
. Der resultierende Verhalten wird in der folgenden Tabelle gezeigt.
switch
Verhalten von Anweisungen
Bedingung | Aktion |
---|---|
Der konvertierte Wert stimmt mit dem des hochgestuften steuernden Ausdrucks überein. | Die Steuerung wird an die Anweisung übertragen, die auf die Bezeichnug folgt. |
Keine der Konstanten stimmt mit den Konstanten in den case Bezeichnungen überein; eine default Beschriftung ist vorhanden. |
Die Steuerung wird auf das default Etikett übertragen. |
Keine der Konstanten stimmt mit den Konstanten in den case Bezeichnungen überein; keine default Beschriftung ist vorhanden. |
Die Steuerung wird nach der Anweisung an die switch Anweisung übertragen. |
Wenn ein übereinstimmenden Ausdruck gefunden wird, kann die Ausführung später case
oder default
beschriftungen fortgesetzt werden. Die break
Anweisung wird verwendet, um die Ausführung zu beenden und die Steuerung nach der Anweisung an die switch
Anweisung zu übertragen. Ohne Eine break
Anweisung wird jede Anweisung von der übereinstimmenden case
Bezeichnung bis zum Ende des switch
, einschließlich des default
, ausgeführt. Beispiel:
// switch_statement1.cpp
#include <stdio.h>
int main() {
const char *buffer = "Any character stream";
int uppercase_A, lowercase_a, other;
char c;
uppercase_A = lowercase_a = other = 0;
while ( c = *buffer++ ) // Walks buffer until NULL
{
switch ( c )
{
case 'A':
uppercase_A++;
break;
case 'a':
lowercase_a++;
break;
default:
other++;
}
}
printf_s( "\nUppercase A: %d\nLowercase a: %d\nTotal: %d\n",
uppercase_A, lowercase_a, (uppercase_A + lowercase_a + other) );
}
Im obigen Beispiel wird erhöht, uppercase_A
wenn c
es sich um einen oberencase'A'
Wert handelt. Die break
Anweisung nach uppercase_A++
beendigung der Ausführung des switch
Anweisungstexts und des Steuerelements wird an die while
Schleife übergeben. Ohne die Anweisung würde die break
Ausführung in die nächste beschriftete Anweisung fallen, sodass lowercase_a
sie other
ebenfalls erhöht wird. Ein ähnlicher Zweck wird von der break
Erklärung für case 'a'
. Wenn c
es sich um einen niedrigerencase'a'
Wert handelt, wird die Anweisung erhöht, lowercase_a
und die break
Anweisung beendet den switch
Textkörper der Anweisung. Wenn c
es sich nicht um eine 'a'
Oder-Anweisung 'A'
handelt, wird die default
Anweisung ausgeführt.
Visual Studio 2017 und höher (im /std:c++17
Modus und höher verfügbar): Das [[fallthrough]]
Attribut wird im C++17-Standard angegeben. Sie können sie in einer switch
Anweisung verwenden. Es ist ein Hinweis auf den Compiler, oder jeder, der den Code liest, dass das Fall-Through-Verhalten beabsichtigt ist. Der Microsoft C++-Compiler warnt derzeit nicht über das Verhalten von Fallthrough, sodass dieses Attribut keine Auswirkungen auf das Compilerverhalten hat. Im Beispiel wird das Attribut auf eine leere Anweisung innerhalb der unterminierten beschrifteten Anweisung angewendet. Das Semikolon ist also erforderlich.
int main()
{
int n = 5;
switch (n)
{
case 1:
a();
break;
case 2:
b();
d();
[[fallthrough]]; // I meant to do this!
case 3:
c();
break;
default:
d();
break;
}
return 0;
}
Visual Studio 2017, Version 15.3 und höher (im /std:c++17
Modus und höher verfügbar): Eine switch
Anweisung kann eine init-statement
Klausel aufweisen, die mit einem Semikolon endet. Sie führt eine Variable ein, deren Bereich auf den Block der switch
Anweisung beschränkt ist, wird eingeführt und initialisiert:
switch (Gadget gadget(args); auto s = gadget.get_status())
{
case status::good:
gadget.zip();
break;
case status::bad:
throw BadGadget();
};
Ein innerer Block einer switch
Anweisung kann Definitionen mit Initialisierern enthalten, solange sie erreichbar sind, d. h. nicht von allen möglichen Ausführungspfaden umgangen werden. Namen, die mit diesen Deklarationen eingeführt werden, weisen einen lokalen Gültigkeitsbereich auf. Beispiel:
// switch_statement2.cpp
// C2360 expected
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
switch( tolower( *argv[1] ) )
{
// Error. Unreachable declaration.
char szChEntered[] = "Character entered was: ";
case 'a' :
{
// Declaration of szChEntered OK. Local scope.
char szChEntered[] = "Character entered was: ";
cout << szChEntered << "a\n";
}
break;
case 'b' :
// Value of szChEntered undefined.
cout << szChEntered << "b\n";
break;
default:
// Value of szChEntered undefined.
cout << szChEntered << "neither a nor b\n";
break;
}
}
Eine switch
Anweisung kann geschachtelt werden. Wenn sie geschachtelt sind, ordnen die case
Bezeichnungen default
der nächstgelegenen switch
Anweisung zu, die sie einschließt.
Microsoft-spezifisches Verhalten
Microsoft C++ beschränkt nicht die Anzahl der case
Werte in einer switch
Anweisung. Die Anzahl wird nur durch den verfügbaren Speicher beschränkt.
Siehe auch
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für