switch -Anweisung (C++)

Ermöglicht die Auswahl von mehreren Codeabschnitten, abhängig vom Wert eines ganzzahligen Ausdrucks.

Syntax

selection-statement:
switch(init-statementoptC++17condition)statement

init-statement:
expression-statement
simple-declaration

condition:
expression
attribute-specifier-seqopt decl-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 conditionlabeled-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 caseconstant-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

Auswahlanweisungen
Schlüsselwörter