다음을 통해 공유


switch 문(C++)

정수 계열 식의 값에 따라 코드의 여러 섹션 중에서 선택할 수 있습니다.

구문

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

설명

switch 문을 통해 컨트롤은 의 값에 따라 문 본문에서 하나의 conditionlabeled-statement 로 전송됩니다.

condition은 정수 형식이거나, 정수 형식으로 명확하게 변환되는 클래스 형식이어야 합니다. 정수 승격은 표준 변환에서 설명한 대로 이루어집니다.

switch 문 본문은 일련의 case 레이블과 선택적 default 레이블로 구성됩니다.opt labeled-statement는 다음 레이블 중 하나로, 뒤에 따르는 문입니다. 레이블 문은 구문적 요구 사항이 아니지만 switch 문은 레이블 문이 없으면 의미가 없습니다. case 문의 두 constant-expression 값은 동일한 값으로 계산할 수 없습니다. default 레이블은 한 번만 나타날 수 있습니다. default 문은 종종 끝에 배치되지만 switch 문 본문의 아무 곳에나 나타날 수 있습니다. case 또는 default 레이블은 switch 문 안에만 나타날 수 있습니다.

case 레이블의 constant-expressioncondition과 동일한 형식인 상수 값으로 변환됩니다. 그런 다음, condition과 같은지 비교됩니다. 컨트롤은 condition 값과 일치하는 case constant-expression 값 뒤의 첫 번째 문으로 전달됩니다. 결과적으로 발생하는 동작은 다음 표에 나와 있습니다.

switch 문 동작

조건 작업
변환된 값이 승격된 제어 식의 값과 일치합니다. 제어가 해당 레이블 뒤에 오는 문으로 전송됩니다.
어떤 상수도 case 레이블의 상수와 일치하지 않으며, default 레이블이 있습니다. 컨트롤이 default 레이블로 전송됩니다.
어떤 상수도 case 레이블의 상수와 일치하지 않으며, default 레이블이 없습니다. 컨트롤이 switch 문 뒤의 문으로 전송됩니다.

일치하는 식을 찾으면 나중에 case 또는 default 레이블을 통해 실행을 계속할 수 있습니다. 실행을 중지하고 switch 문 뒤의 문으로 컨트롤을 전송하는 데 break 문이 사용됩니다. break 문이 없으면 default를 포함하여, 일치하는 case 레이블부터 switch 끝까지의 모든 문이 실행됩니다. 예시:

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

위 예에서 uppercase_Ac가 대문자 case'A'인 경우 증가합니다. uppercase_A++ 뒤의 break 문이 switch 문 본문의 실행을 종료하고 컨트롤을 while 루프로 전달합니다. break 문이 없으면 실행이 레이블이 지정된 다음 문으로 "fall-through"되므로 lowercase_aother 또한 증가하게 됩니다. case 'a'에 대한 break 문도 비슷한 역할을 합니다. c가 소문자 case'a'인 경우 lowercase_a가 증가하고 break 문이 switch 문 본문을 종료합니다. c'a' 또는 'A'가 아닌 경우 default 문이 실행됩니다.

Visual Studio 2017 이상(/std:c++17 모드 이상에서 사용 가능): [[fallthrough]] 특성이 C++17 표준에서 지정됩니다. 이는 switch 문에서만 사용할 수 있습니다. fall-through 동작이 의도적이라는 점은 컴파일러 또는 코드를 읽는 모든 사람에게 힌트가 됩니다. Microsoft C++ 컴파일러는 현재 fallthrough 동작에 대해 경고하지 않으므로 이 특성은 컴파일러 동작에 영향을 주지 않습니다. 이 예에서 특성은 종료되지 않은 레이블이 있는 문 내의 빈 문에 적용됩니다. 즉, 세미콜론이 필요합니다.

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 버전 15.3 이상(/std:c++17 모드 이상에서 사용 가능): switch 문에 세미콜론으로 끝나는 init-statement 절이 있을 수 있습니다. 이는 범위가 switch 문의 블록으로 제한되는 변수를 도입하고 초기화합니다.

    switch (Gadget gadget(args); auto s = gadget.get_status())
    {
    case status::good:
        gadget.zip();
        break;
    case status::bad:
        throw BadGadget();
    };

switch 문의 내부 블록은 도달 가능한 한, 즉 가능한 모든 실행 경로에서 무시되지 않는 한 이니셜라이저가 있는 정의를 포함할 수 있습니다. 이러한 선언을 사용하여 정의된 이름에는 로컬 범위가 있습니다. 예시:

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

switch 문은 중첩될 수 있습니다. 중첩되는 경우 case 또는 default 레이블은 이들을 묶는 가장 가까운 switch 문에 연결됩니다.

Microsoft 전용 동작

Microsoft C++은 switch 문의 case 값의 수를 제한하지 않습니다. 이 수는 사용 가능한 메모리에 의해서만 제한됩니다.

참고 항목

선택 문
키워드