switch
문(C++)
정수 계열 식의 값에 따라 코드의 여러 섹션 중에서 선택할 수 있습니다.
구문
selection-statement
:
switch
(
init-statement
optC++17condition
)
statement
init-statement
:
expression-statement
simple-declaration
condition
:
expression
attribute-specifier-seq
optdecl-specifier-seq
declarator
brace-or-equal-initializer
labeled-statement
:
case
constant-expression
:
statement
default
:
statement
설명
switch
문을 통해 컨트롤은 의 값에 따라 문 본문에서 하나의 condition
labeled-statement
로 전송됩니다.
condition
은 정수 형식이거나, 정수 형식으로 명확하게 변환되는 클래스 형식이어야 합니다. 정수 승격은 표준 변환에서 설명한 대로 이루어집니다.
switch
문 본문은 일련의 case
레이블과 선택적 default
레이블로 구성됩니다.opt labeled-statement
는 다음 레이블 중 하나로, 뒤에 따르는 문입니다. 레이블 문은 구문적 요구 사항이 아니지만 switch
문은 레이블 문이 없으면 의미가 없습니다. case
문의 두 constant-expression
값은 동일한 값으로 계산할 수 없습니다. default
레이블은 한 번만 나타날 수 있습니다. default
문은 종종 끝에 배치되지만 switch
문 본문의 아무 곳에나 나타날 수 있습니다. case
또는 default
레이블은 switch
문 안에만 나타날 수 있습니다.
각 case
레이블의 constant-expression
은 condition
과 동일한 형식인 상수 값으로 변환됩니다. 그런 다음, 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_A
는 c
가 대문자 case'A'
인 경우 증가합니다. uppercase_A++
뒤의 break
문이 switch
문 본문의 실행을 종료하고 컨트롤을 while
루프로 전달합니다. break
문이 없으면 실행이 레이블이 지정된 다음 문으로 "fall-through"되므로 lowercase_a
및 other
또한 증가하게 됩니다. 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
값의 수를 제한하지 않습니다. 이 수는 사용 가능한 메모리에 의해서만 제한됩니다.
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기