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구성됩니다. A labeled-statement 는 다음 레이블 및 문 중 하나입니다. 레이블이 지정된 문은 구문 요구 사항이 아니지만 switch 문이 없으면 의미가 없습니다. 문의 두 constant-expressioncase 은 동일한 값으로 계산할 수 없습니다. 레이블은 default 한 번만 표시할 수 있습니다. 문은 default 종종 끝에 배치되지만 문 본문의 switch 아무 곳에나 나타날 수 있습니다. case 또는 default 레이블은 switch 문 안에만 나타날 수 있습니다.

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

switch 문 동작

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

일치하는 식을 찾으면 나중에 case 실행하거나 default 레이블을 계속 실행할 수 있습니다. 문은 break 실행을 중지하고 문 후 switch 문으로 제어를 전송하는 데 사용됩니다. break 문이 없으면 일치하는 case 레이블에서 끝switch까지의 모든 문(예: )이 default실행됩니다. 예시:

// 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_A 에서는 위쪽case'A'인 경우 c 증가합니다. break 문 본문의 실행을 종료하고 컨트롤이 switch 루프에 전달된 후 uppercase_A++while 문입니다. break 문이 없으면 실행이 레이블이 지정된 다음 문으로 "넘어지게"되므로 lowercase_aother 증가합니다. 에 대한 case 'a'문에서 비슷한 용도로 break 제공됩니다. 더 낮은'a'lowercase_acase 경우 c 증가되고 문은 break 문 본문을 종료합니다.switch 그렇지 않은 'a''A'default 경우 c 문이 실행됩니다.

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

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 제한하지 않습니다. 이 수는 사용 가능한 메모리에 의해서만 제한됩니다.

참고 항목

선택 문
키워드