C++에서 switch 문 사용

Jinku Hu 2023년10월12일
  1. switch문을 사용하여 다중 사례 코드 경로 시나리오 구성
  2. default 키워드를 사용하여switch에서 기본 코드 경로 지정
  3. {}블록 표기법을 사용하여 다른 코드 경로에서 지역 변수 선언
C++에서 switch 문 사용

이 기사에서는 C++에서switch 문을 사용하는 방법에 대한 몇 가지 방법을 설명합니다.

switch문을 사용하여 다중 사례 코드 경로 시나리오 구성

switch 키워드는 주어진 표현식을 조건으로 평가하는 다른 블록 기반 문과 유사하게 사용됩니다. 유일한 차이점은 case키워드로 지정된 각 코드 경로와 비교하여 표현식에 정수 값이 있어야한다는 것입니다. 경로의 구조는 다음과 같습니다.case label : statements 여기서labelswitch 조건의 표현식과 비교 한 값입니다. 표현식이 레이블 중 하나와 일치하면 프로그램 실행은 해당 레이블 뒤의 명령문으로 이동합니다. case 블록이break;문으로 끝나지 않으면 프로그램은break;에 도달하지 않거나switch 범위 자체가 끝났습니다.

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

default 키워드를 사용하여switch에서 기본 코드 경로 지정

default 키워드는 선언 된 케이스 중switch 표현식과 일치하는 케이스가없는 경우 실행되는 특수 케이스 레이블을 정의합니다. 알아 두어야 할 중요한 점은 모든 레이블 블록이switch 구조의 기본 논리를 충족하기 위해 끝에break;문이 필요하다는 것입니다. 다음 코드 샘플은 중단없이 switch문을 보여 주며 이는 다소 갑작스럽게 작동합니다. week_day 값이 첫 번째 레이블Monday와 일치하면 기본 레이블 옆에있는 문을 포함하여 모든cout 문이 실행됩니다. 반면에week_day 값이 case 레이블과 일치하지 않으면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에서 초기화되면 다른 경우의 문은 동일한 변수를 참조 할 수 없습니다. 다음 예제는case Friday에 대한 로컬 블록이 있고 내부 변수가 다른case에서 보이지 않는switch 문을 구현합니다.

#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);
}
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook