switch statement
정수 인자의 값에 따라 코드를 실행합니다.
여러 코드 분기 중 하나 또는 여러 개가 정수 값에 따라 실행되어야 할 때 사용됩니다.
목차 |
구문
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 문은 블록 범위 를 설정합니다: 표현식 에서 도입된 모든 식별자는 문 이후에 범위를 벗어납니다.
VLA 또는 가변 수정 타입을 가진 다른 식별자가 해당 범위 내에
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부터) |
키워드
예제
#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
문
|