다음을 통해 공유


switch 문 (C++)

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

switch ( expression )
   case constant-expression : statement
   [default   : statement]

설명

expression은 정수 계열 형식 또는 정수 계열 형식으로의 명확한 변환이 있는 클래스 형식이어야 합니다. 정수 계열 확장은 정수 계열 확장에 설명된 대로 수행됩니다.

switch 문 본문은 일련의 case 레이블과 선택적 default 레이블로 구성됩니다. case 문에서는 어떤 두 상수 식도 동일한 값으로 계산될 수 없습니다. default 레이블은 한 번만 나타날 수 있습니다. 레이블 문은 구문적 요구 사항이 아니지만 switch 문은 레이블 문이 없으면 의미가 없습니다. 기본 문은 끝에 오지 않아도 되며 switch 문의 본문 중 어느 위치에나 나타날 수 있습니다. case 또는 default 레이블은 switch 문 내에만 나타날 수 있습니다.

case 레이블의 constant-expressionexpression의 형식으로 변환되고 expression과 같은지 비교됩니다. case constant-expressionexpression의 값과 일치하는 문으로 제어가 전달됩니다. 결과적으로 발생하는 동작은 다음 표에 나와 있습니다.

switch 문 동작

조건

작업

변환된 값이 승격된 제어 식의 값과 일치합니다.

제어가 해당 레이블 뒤에 오는 문으로 전송됩니다.

어떤 상수도 case 레이블의 상수와 일치하지 않고 default 레이블이 있습니다.

제어가 default 레이블로 전송됩니다.

어떤 상수도 case 레이블의 상수와 일치하지 않고 default 레이블이 없습니다.

제어가 switch 문 뒤의 문으로 전송됩니다.

일치하는 식이 발견되면 후속 case 또는 default 레이블에 의해 제어가 방해되지 않습니다. 실행을 중지하고 switch 문 뒤의 문으로 제어를 전송하는 데에는 break 문이 사용됩니다. break 문이 없으면 일치하는 case 레이블에서 switch의 끝까지(default 포함) 모든 문이 실행됩니다. 예를 들면 다음과 같습니다.

// switch_statement1.cpp
#include <stdio.h>

int main() {
   char *buffer = "Any character stream";
   int capa, lettera, nota;
   char c;
   capa = lettera = nota = 0;

   while ( c = *buffer++ )   // Walks buffer until NULL
   {
      switch ( c )
      {
         case 'A':
            capa++;
            break;
         case 'a':
            lettera++;
            break;
         default:
            nota++;
      }
   }
   printf_s( "\nUppercase a: %d\nLowercase a: %d\nTotal: %d\n",
      capa, lettera, (capa + lettera + nota) );
}

위의 예제에서 capa는 c가 대문자 A인 경우 증가됩니다. capa++ 뒤의 break 문이 switch 문 본문의 실행을 종료하고 제어를 while 루프로 전달합니다. break 문이 없으면 lettera 및 nota도 증가됩니다. case 'a'에 대한 break 문도 비슷한 역할을 합니다. c가 소문자 a인 경우 lettera가 증가하고 break 문이 switch 문 본문을 종료합니다. c가 a 또는 A가 아닌 경우 default 문이 실행됩니다.

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 값 수를 제한하지 않습니다. 이 수는 사용 가능한 메모리에 의해서만 제한됩니다. ANSI C의 경우 switch 문에서 257개 이상의 case 레이블이 허용되어야 합니다.

기본적으로 Microsoft C에는 Microsoft 확장을 사용하도록 설정되어 있습니다. /Za 컴파일러 옵션을 사용하여 이러한 확장을 비활성화하십시오.

참고 항목

참조

선택문 (C++)

C++ 키워드

case 문에서 레이블 사용