C++ で switch ステートメントを使用する

胡金庫 2023年10月12日
  1. マルチケースコードパスのシナリオを構築するために switch 文を使用する
  2. デフォルトのコードパスを switch の中で指定するには default キーワードを使用する
  3. 異なるコードパスでローカル変数を宣言するために {} ブロック記法を使用する
C++ で switch ステートメントを使用する

この記事では、C++ での switch 文の使い方についていくつかの方法を説明します。

マルチケースコードパスのシナリオを構築するために switch 文を使用する

switch キーワードは、与えられた式を条件として評価する他のブロックベースの文と同様に使用されます。唯一の違いは、式が case キーワードで指定された各コードパスと比較して積分値を持たなければならないことです。パスは次のような構造になっています - case label : statements ここで、labelswitch 条件で指定された式と比較される値です。式がラベルのいずれかにマッチした場合、プログラムの実行はそのラベルの後に続くステートメントに移る。case ブロックが break; 文で終了しなかった場合、プログラムは break; に到達しないか switch スコープ自体が終了するまで、それに続くすべての case ブロックの文を実行し続けることに注意してください。

#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::string;

enum WEEK { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday };

int main() {
  int week_day;

  cout << "Type the weekday (0-6): ";
  cin >> week_day;
  if (cin.fail()) {
    cout << "Error occured when reading from stream!" << endl;
    exit(EXIT_FAILURE);
  };

  switch (week_day) {
    case Monday:
      cout << "Monday\n";
      break;
    case Tuesday:
      cout << "Tuesday\n";
      break;
    case Wednesday:
      cout << "Wednesday\n";
      break;
    case Thursday:
      cout << "Thursday\n";
      break;
    case Friday:
      cout << "Friday\n";
      break;
    case Saturday:
      cout << "Saturday\n";
      break;
    case Sunday:
      cout << "Sunday\n";
      break;
    default:
      exit(EXIT_FAILURE);
  }

  exit(EXIT_SUCCESS);
}

デフォルトのコードパスを switch の中で指定するには default キーワードを使用する

default キーワードは、宣言されたケースのどれもが switch 式にマッチしない場合に実行される特殊なケースのラベルを定義します。注意すべき重要な点は、すべてのラベルブロックは switch 構造体の基本的なロジックを満たすために最後に break; 文を必要とするということです。次のコードサンプルでは、switch 文をブレークなしで実行していますが、これはかなり突然の動作になることに注意してください。もし week_day の値が最初のラベル Monday と一致した場合、デフォルトラベルの横にあるものも含めて、すべての cout 文が実行されます。一方、week_day の値が大文字小文字のラベルと一致しない場合は、default のラベルで始まる cout 文が実行されます。

#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::string;

enum WEEK { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday };

int main() {
  int week_day;

  cout << "Type the weekday (0-6): ";
  cin >> week_day;
  if (cin.fail()) {
    cout << "Error occured when reading from stream!" << endl;
    exit(EXIT_FAILURE);
  };

  switch (week_day) {
    case Monday:
      cout << "Monday\n";
    case Tuesday:
      cout << "Tuesday\n";
    case Wednesday:
      cout << "Wednesday\n";
    case Thursday:
      cout << "Thursday\n";
    case Friday:
      cout << "Friday\n";
    default:
      cout << "Wrong number specified!\n";
    case Saturday:
      cout << "Saturday\n";
    case Sunday:
      cout << "Sunday\n";
  }

  exit(EXIT_SUCCESS);
}

異なるコードパスでローカル変数を宣言するために {} ブロック記法を使用する

他のブロックベースのステートメントと同様に、switch のボディは変数を宣言できるスコープを持っていますが、ケースでは各 case 構造体の中にローカル変数を持つ必要があります。すべての case パスのステートメントは、{} 内の別のブロック内で宣言されていない限り、スコープを共有していることに注意してください。したがって、ある case で変数が初期化された場合、他のケースのステートメントが同じ変数を参照することはできません。次の例は、switch 文を実装したもので、case Friday のローカルブロックがあり、その中の変数は他の case からは見えないようになっています。

#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::string;

enum WEEK { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday };

int main() {
  int week_day;

  cout << "Type the weekday (0-6): ";
  cin >> week_day;
  if (cin.fail()) {
    cout << "Error occured when reading from stream!" << endl;
    exit(EXIT_FAILURE);
  };

  switch (week_day) {
    case Monday:
      cout << "Monday\n";
      break;
    case Tuesday:
      cout << "Tuesday\n";
      break;
    case Wednesday:
      cout << "Wednesday\n";
      break;
    case Thursday:
      cout << "Thursday\n";
      break;
    case Friday: {
      string str = "Friday";
      cout << str << endl;
      break;
    }
    case Saturday:
      cout << "Saturday\n";
      break;
    case Sunday:
      cout << "Sunday\n";
      break;
    default:
      exit(EXIT_FAILURE);
  }

  exit(EXIT_SUCCESS);
}
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook