Die switch-Anweisungen in C++

Suraj P 12 Oktober 2023
  1. die switch-case-Anweisung in C++
  2. Regeln und Eigenschaften bei der Verwendung von Switch Case in C++
  3. Unterschied zwischen switch-Anweisungen und if-else-Anweisungen in C++
Die switch-Anweisungen in C++

In diesem Artikel lernen wir switch-Anweisungen in C++ und ihre speziellen Eigenschaften kennen.

die switch-case-Anweisung in C++

Der switch-case wertet den Ausdruck basierend auf seinem Wert aus und wird anhand einer Liste von konstanten Werten getestet, die in case-Anweisungen vorhanden sind, um verschiedene Aktionen basierend auf verschiedenen cases auszuführen.

Switch-Anweisungen sind wie if-else Kontrollflussanweisungen, weil sie den allgemeinen Ablauf eines Programms verändern können, weil sie einem Ausdruck oder einer Variablen erlauben, den Fluss über eine Mehrfachverzweigung zu steuern.

Syntax:

switch(variable / expression)
{
case constant-expression 1:
  statements;

case constant-expression 2:
  statements;
}

Beispielcode:

#include <iostream>
using namespace std;

int main() {
  int day = 3;
  switch (day) {
    case 1:
      cout << "Monday\n";

    case 2:
      cout << "Tuesday\n";

    case 3:
      cout << "Wednesday\n";

    case 4:
      cout << "Thursday\n";

    case 5:
      cout << "Friday\n";

    case 6:
      cout << "Saturday\n";

    case 7:
      cout << "Sunday\n";
  }
}

Ausgabe:

Wednesday
Thursday
Friday
Saturday
Sunday

Der Wert der Variablen day = 3 wird ausgewertet und mit der entsprechenden Case-Anweisung case 3 abgeglichen, und die darin enthaltene Aussage "Wednesday" wird ausgegeben, aber wir erhalten immer noch die restlichen Zeichenfolgen, weil einmal die Steuerung geht zu case 3, ab da alles bis zum Ende des Schalterblocks, alle Anweisungen werden gedruckt/ausgewertet.

Deshalb werden die Aussagen aus Fälle 4,5,6,7 abgedruckt.

Um dies zu vermeiden, müssen wir unsere switch-case-Struktur ändern.

Syntax - Modifiziertes switch-case:

switch(variable / expression)
{
case constant-expression 1:
  statements;
  break; (optional)

case constant-expression 2:
  statements;
  break; (optional)

default:  //default statment optional
  statements;
  break;
}

Das Schlüsselwort break wird verwendet, um die Ausführung des switch-Blocks zu stoppen und ihn zu verlassen. Sobald die Bedingung/der Fall zutrifft, werten wir die Anweisungen aus, unterbrechen den Fluss und verlassen den Switch-Block.

Das Schlüsselwort default gibt Anweisungen an, die ausgeführt werden, wenn kein Fall zutrifft.

Beispielcode:

#include <iostream>
using namespace std;

int main() {
  int day = 3;
  switch (day) {
    case 1:
      cout << "Monday\n";
      break;
    case 2:
      cout << "Tuesday\n";
      break;

    case 3:
      cout << "Wednesday\n";
      break;
    case 4:
      cout << "Thursday\n";
      break;

    case 5:
      cout << "Friday\n";
      break;

    case 6:
      cout << "Saturday\n";
      break;

    case 7:
      cout << "Sunday\n";
      break;

    default:
      cout << "Wrong option entereted\n";
      break;
  }
}

Ausgabe:

Wednesday

In diesem nächsten Beispiel können wir auch mit char umschalten. Wir sehen einen Beispielcode, der prüft, ob ein Zeichen ein Vokal oder ein Konsonant ist.

Beispielcode:

#include <iostream>
using namespace std;

int main() {
  char x = 'u';

  switch (x) {
    case 'a':
      cout << "Vowel";
      break;
    case 'e':
      cout << "Vowel";
      break;
    case 'i':
      cout << "Vowel";
      break;
    case 'o':
      cout << "Vowel";
      break;
    case 'u':
      cout << "Vowel";
      break;

    default:
      cout << "Consonant";
      break;
  }
}

Ausgabe:

Vowel

Regeln und Eigenschaften bei der Verwendung von Switch Case in C++

  1. Der innerhalb der switch-Anweisung verwendete Ausdruck sollte ein konstanter Wert sein. Andernfalls wird es als ungültig betrachtet.

    Hier sehen wir, dass konstante und variable Ausdrücke, sofern sie mit festen Werten belegt sind, verwendet werden können.

    switch (1 + 2 + 3 * 4 + 5)
      switch (a + b + c * d)
    
  2. default und break sind optional. Auch wenn das switch-case diese nicht hat, läuft es problemlos.

  3. Das Verschachteln von switch-Anweisungen ist gültig, was bedeutet, dass wir Anweisungen innerhalb einer anderen tauschen können. Obwohl es keine gute Programmierpraxis ist, können wir sie dennoch verwenden.

    #include <iostream>
    using namespace std;
    
    int main() {
      int ID = 1234;
      int password = 000;
    
      switch (ID) {
        case 1234:
          cout << "checking info......\n";
    
          switch (password) {
            case 000:
              cout << "Login successful\n";
              break;
            default:
              cout << "Password don't match please check it\n";
              break;
          }
    
          break;
    
        default:
          printf("incorrect ID");
          break;
      }
    }
    

    Ausgabe:

    checking info......
    Login successful
    
  4. Der in der switch-Anweisung verwendete Ausdruck muss ein ganzzahliger Typ sein, d. h. er sollte int, char oder enum sein. Andernfalls erhalten wir einen Kompilierungsfehler.

    #include <iostream>
    using namespace std;
    
    int main() {
      float x = 12.34;
    
      switch (x) {
        case 1.1:
          cout << "Yes";
          break;
        case 12.34:
          cout << "NO";
          break;
      }
    }
    

    Ausgabe:

    [Error] switch quantity not an integer
    
  5. Der default-Block kann sich innerhalb des switch befinden, aber nur ausgeführt werden, wenn keine Fälle übereinstimmen.

    #include <iostream>
    using namespace std;
    
    int main() {
      int x = 45;
      switch (x) {
        default:
          cout << "It's not 1 or 2";
          break;
        case 1:
          cout << "It's a 1";
          break;
        case 2:
          cout << "It's a 2";
          break;
      }
    }
    

    Ausgabe:

    It's not 1 or 2
    
  6. Die über dem Fall geschriebenen Aussagen werden niemals ausgeführt. Sobald die switch-Anweisung ausgewertet ist, wechselt die Steuerung entweder zum übereinstimmenden Fall oder zum default-Block, falls vorhanden.

    #include <iostream>
    using namespace std;
    
    int main() {
      int x = 45;
      switch (x) {
        cout << "Tony is Iron Man\n";
        case 1:
          cout << "It's a 1";
          break;
        case 2:
          cout << "It's a 2";
          break;
    
        default:
          cout << "It's not 1 or 2";
          break;
      }
    }
    

    Ausgabe:

    It's not 1 or 2
    
  7. Doppelte Kartonetiketten sind nicht erlaubt. Wenn angegeben, erhalten wir einen Kompilierungsfehler.

    #include <iostream>
    using namespace std;
    
    int main() {
      int x = 45;
      switch (x) {
        case 45:
          cout << "Iron Man";
          break;
    
        case 40 + 5:
          cout << "tony stark";
          break;
    
        default:
          cout << "It's not 1 or 2";
          break;
      }
    }
    

    Ausgabe:

    [Error] duplicate case value
    
  8. Die Fallbezeichnungen sollten ebenfalls konstant sein. Andernfalls erhalten wir einen Kompilierfehler.

    #include <iostream>
    using namespace std;
    
    int main() {
      int x = 2;
      int arr[] = {100, 200, 300};
      switch (x) {
        case arr[0]:
          cout << "Iron Man";
          break;
    
        case arr[1]:
          cout << "tony stark";
          break;
    
        case arr[2]:
          cout << "It's not 1 or 2";
          break;
      }
    }
    

    Ausgabe:

    [Error] the value of 'arr' is not usable in a constant expression
    
  9. Wir können alle case-Anweisungen gruppieren, die dieselbe Aufgabe erfüllen.

    #include <iostream>
    using namespace std;
    
    int main() {
      char x = 'A';
    
      switch (x) {
        case 'a':
        case 'e':
        case 'i':
        case 'o':
        case 'u':
        case 'A':
        case 'E':
        case 'I':
        case 'O':
        case 'U':
          cout << "Vowel";
          break;
    
        default:
          cout << "consonant";
      }
    }
    

Unterschied zwischen switch-Anweisungen und if-else-Anweisungen in C++

Wenn wir viele if-else-Anweisungen haben, muss der Compiler alle prüfen, bis eine gültige Übereinstimmung gefunden wird. Während in switch-case Anweisungen verwendet werden, wenn ein bestimmter Codeblock nur ausgeführt werden soll, wenn eine bestimmte Bedingung erfüllt ist.

Das folgende Beispiel prüft ein Zeichen, ob es ein Alphabet ist oder nicht.

Beispielcode:

char x = '+';

if (x == 'A')
....

    else if (x == 'B')...

    else if (x == 'C')...

    ....else cout
    << "Not an alphabet"

Da + kein Alphabet ist, dauert es viel länger, das letzte zu erreichen, weil es zuerst jede vorherige Bedingung prüfen muss. Wenn es mit switch-case implementiert wird, verwendet es eine Lookup-Tabelle oder eine Hash-Liste, wenn die Anzahl der Fälle/Bedingungen sehr groß ist.

Das bedeutet, dass alle Artikel die gleiche Zugriffszeit erhalten. Wenn wir also viele Fälle/Bedingungen haben, wird switch gegenüber if-else bevorzugt, da es schneller ist.

Autor: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub

Verwandter Artikel - C++ Statement