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구성됩니다. A labeled-statement
는 다음 레이블 및 문 중 하나입니다. 레이블이 지정된 문은 구문 요구 사항이 아니지만 switch
문이 없으면 의미가 없습니다. 문의 두 constant-expression
값 case
은 동일한 값으로 계산할 수 없습니다. 레이블은 default
한 번만 표시할 수 있습니다. 문은 default
종종 끝에 배치되지만 문 본문의 switch
아무 곳에나 나타날 수 있습니다. case
또는 default
레이블은 switch
문 안에만 나타날 수 있습니다.
constant-expression
각 case
레이블의 형식이 같은 상수 값으로 condition
변환됩니다. 그런 다음 같음과 condition
비교됩니다. 컨트롤은 값과 일치하는 값 뒤의 case
constant-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_a
other
증가합니다. 에 대한 case 'a'
문에서 비슷한 용도로 break
제공됩니다. 더 낮은'a'
lowercase_a
case 경우 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
제한하지 않습니다. 이 수는 사용 가능한 메모리에 의해서만 제한됩니다.
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기