C++ での switch ステートメント

Suraj P 2023年10月12日
  1. C++ の switch-case ステートメント
  2. C++ で Switch Case を使用する際のルールとプロパティ
  3. C++ での switch ステートメントと if-else ステートメントの違い
C++ での switch ステートメント

この記事では、C++ の switch ステートメントとその特別なプロパティについて学習します。

C++ の switch-case ステートメント

switch-case は、その値に基づいて式を評価し、case ステートメントに存在する定数値のリストに対してテストされ、さまざまな cases に基づいてさまざまなアクションを実行します。

if-else と同様に、switch ステートメントは制御フローステートメントです。これは、式または変数が多方向分岐を介してフローを制御できるため、プログラムの一般的なフローを変更できるためです。

構文:

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

case constant-expression 2:
  statements;
}

コード例:

#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";
  }
}

出力:

Wednesday
Thursday
Friday
Saturday
Sunday

変数 day = 3 の値が評価され、case 3 であるそれぞれの case ステートメントと照合され、"Wednesday"であるステートメントが出力されますが、残りの文字列は制御は case 3 に進み、そこからスイッチブロックの終わりまで、すべてのステートメントが出力/評価されます。

そのため、ケース 4,5,6,7 のステートメントが出力されます。

これを回避するには、switch-case 構造を変更する必要があります。

構文-変更された 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;
}

break キーワードは、スイッチブロックの実行を停止して終了するために使用されます。条件/ケースが一致すると、ステートメントを評価し、フローを中断して、スイッチブロックから抜け出します。

default キーワードは、大文字と小文字が一致しない場合に実行されるステートメントを指定します。

コード例:

#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;
  }
}

出力:

Wednesday

この次の例では、char で切り替えることもできます。文字が母音であるか子音であるかをチェックするサンプルコードが表示されます。

コード例:

#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;
  }
}

出力:

Vowel

C++ で Switch Case を使用する際のルールとプロパティ

  1. switch ステートメント内で使用される式は、定数値である必要があります。それ以外の場合は無効と見なされます。

ここでは、固定値が割り当てられている定数式と変数式を使用できることがわかります。

```c++
switch (1 + 2 + 3 * 4 + 5)
  switch (a + b + c * d)
```
  1. defaultbreak はオプションです。switch-case にそれらがなくても、問題なく動作します。

  2. switch ステートメントのネストは有効です。つまり、ステートメントを別のステートメント内で切り替えることができます。これは良いプログラミング手法ではありませんが、それでも利用できます。

    #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;
      }
    }
    

    出力:

    checking info......
    Login successful
    
  3. switch ステートメント内で使用される式は、整数型である必要があります。つまり、intchar、または enum である必要があります。そうしないと、コンパイルエラーが発生します。

    #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;
      }
    }
    

    出力:

    [Error] switch quantity not an integer
    
  4. default ブロックは switch 内に置くことができますが、一致するケースがない場合にのみ実行されます。

    #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;
      }
    }
    

    出力:

    It's not 1 or 2
    
  5. ケースの上に書かれたステートメントは決して実行されません。switch ステートメントが評価されると、コントロールは一致するケースまたは default ブロック(存在する場合)のいずれかにシフトします。

    #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;
      }
    }
    

    出力:

    It's not 1 or 2
    
  6. ケースラベルを複製することはできません。指定すると、コンパイルエラーが発生します。

    #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;
      }
    }
    

    出力:

    [Error] duplicate case value
    
  7. ケースラベルも一定である必要があります。そうしないと、コンパイルエラーが発生します。

    #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;
      }
    }
    

    出力:

    [Error] the value of 'arr' is not usable in a constant expression
    
  8. 同じタスクを実行するすべての case ステートメントをグループ化できます。

    #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";
      }
    }
    

C++ での switch ステートメントと if-else ステートメントの違い

if-else ステートメントが多数ある場合、コンパイラは、有効な一致が見つかるまでそれらすべてをチェックする必要があります。switch-case では、特定の条件が満たされた場合に、特定のコードブロックのみを実行する場合にステートメントが使用されます。

次の例では、文字がアルファベットかどうかをチェックします。

コード例:

char x = '+';

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

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

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

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

+ はアルファベットではないため、最初にすべての前の条件を調べる必要があるため、最後に到達するまでにはるかに長い時間がかかります。switch-case を使用して実装した場合、ケース/条件の数が非常に多い場合は、ルックアップテーブルまたはハッシュリストを使用します。

これは、すべてのアイテムが同じアクセス時間を取得することを意味します。したがって、多くのケース/条件がある場合は、if-else よりも switch の方が高速であるため、優先されます。

著者: 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

関連記事 - C++ Statement