Namespaces
Variants

switch statement

From cppreference.net

정수 인자의 값에 따라 코드를 실행합니다.

여러 코드 분기 중 하나 또는 여러 개가 정수 값에 따라 실행되어야 할 때 사용됩니다.

목차

구문

attr-spec-seq (선택 사항) switch ( expression ) statement
attr-spec-seq - (C23) 선택적 속성 목록, switch 문에 적용됨
expression - 정수 타입(char, signed 또는 unsigned 정수, 또는 열거형)의 표현식
statement - 모든 (일반적으로 복합문). case: default: 레이블이 statement 내에서 허용되며, break ; 문은 특별한 의미를 가짐
case constant-expression : statement (1) (C23 이전)
attr-spec-seq (선택사항) case constant-expression : statement (선택사항) (1) (C23 이후)
default : statement (2) (C23 이전)
attr-spec-seq (선택사항) default : statement (선택사항) (2) (C23 이후)
constant-expression - 임의의 정수형 constant expression
attr-spec-seq - (C23) 선택적 attributes 목록, 레이블에 적용됨

설명

switch 문의 본문은 임의의 수의 case: 레이블을 가질 수 있으며, 모든 constant-expressions 의 값이 ( conversion 을 통해 promoted type 으로 변환된 후) 고유한 경우에 한합니다. 최대 하나의 default: 레이블이 존재할 수 있습니다 (비록 중첩된 switch 문이 자체적인 default: 레이블을 사용하거나, 바깥쪽 switch에서 사용된 상수와 동일한 상수를 가진 case: 레이블을 가질 수는 있지만).

만약 expression 이 승격된 타입으로 변환된 후 그 값이 constant-expression 중 하나의 값과 동일하다고 평가되면, 제어는 해당 constant-expression 으로 레이블이 지정된 문으로 이동합니다.

만약 expression 이 어떤 case: 레이블과도 일치하지 않는 값으로 평가되고, default: 레이블이 존재하는 경우, 제어는 default: 레이블이 지정된 문으로 이동합니다.

만약 expression 이 어떤 case: 레이블과도 일치하지 않는 값으로 평가되고, default: 레이블이 존재하지 않으면, switch 본문의 어떤 부분도 실행되지 않습니다.

break 문은 statement 내 어디에서든 만나면 switch 문을 종료합니다:

switch(1) {
    case 1 : puts("1"); // "1"을 출력하고,
    case 2 : puts("2"); // 이어서 "2"를 출력합니다 ("fall-through")
}
switch(1) {
    case 1 : puts("1"); // "1"을 출력함
             break;     // 그리고 switch문을 종료함
    case 2 : puts("2");
             break;
}

다른 모든 선택 및 반복문과 마찬가지로, switch 문은 블록 범위 를 설정합니다: 표현식 에서 도입된 모든 식별자는 이후에 범위를 벗어납니다.

VLA 또는 가변 수정 타입을 가진 다른 식별자가 해당 범위 내에 case: 또는 default: 레이블을 가지고 있다면, 전체 switch 문은 해당 식별자의 범위 내에 있어야 합니다 (즉, VLA는 전체 switch 이전이나 마지막 레이블 이후에 선언되어야 합니다):

switch (expr)
{
        int i = 4; // not a VLA; OK to declare here
        f(i); // never called
//      int a[i]; // error: VLA cannot be declared here
    case 0:
        i = 17;
    default:
        int a[i]; // OK to declare VLA here
        printf("%d\n", i); // prints 17 if expr == 0, prints indeterminate value otherwise
}
(C99부터)

키워드

switch , case , default

예제

#include <stdio.h>
void func(int x)
{
   printf("func(%d): ", x);
   switch(x)
   {
      case 1: printf("case 1, ");
      case 2: printf("case 2, ");
      case 3: printf("case 3.\n"); break;
      case 4: printf("case 4, ");
      case 5:
      case 6: printf("case 5 or case 6, ");
      default: printf("default.\n");
   }
}
int main(void)
{
   for(int i = 1; i < 9; ++i) func(i);
}

출력:

func(1): case 1, case 2, case 3.
func(2): case 2, case 3.
func(3): case 3.
func(4): case 4, case 5 or case 6, default.
func(5): case 5 or case 6, default.
func(6): case 5 or case 6, default.
func(7): default.
func(8): default.

참조문헌

  • C17 표준 (ISO/IEC 9899:2018):
  • 6.8.4.2 switch 문 (p: 108-109)
  • C11 표준 (ISO/IEC 9899:2011):
  • 6.8.4.2 switch 문 (p: 149-150)
  • C99 표준 (ISO/IEC 9899:1999):
  • 6.8.4.2 switch 문 (p: 134-135)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 3.6.4.2 switch 문

참고 항목

C++ 문서 for switch