Statements
Statements 는 C++ 프로그램에서 순차적으로 실행되는 조각들입니다. 모든 함수의 본문은 일련의 statements로 구성됩니다. 예를 들어:
int main() { int n = 1; // 선언문 n = n + 1; // 표현식 문 std::cout << "n = " << n << '\n'; // 표현식 문 return 0; // 반환문 }
C++는 다음과 같은 유형의 문(statement)을 포함합니다:
| (C++26부터) |
| (TM TS) |
목차 |
레이블 문
레이블 문은 제어 흐름 목적으로 문에 레이블을 지정합니다.
| 레이블 문 | |||||||||
| label | - | 문장에 적용되는 레이블 (아래에 정의됨) |
| statement | - | 레이블이 적용되는 문장, 레이블이 지정된 문장 자체일 수 있어 여러 레이블을 허용함 |
레이블
label 은 다음과 같이 정의됩니다.
attr
(선택 사항)
identifier
:
|
(1) | ||||||||
attr
(선택 사항)
case
constexpr
:
|
(2) | ||||||||
attr
(선택 사항)
default:
|
(3) | ||||||||
|
속성 시퀀스 attr 은 레이블 바로 앞에 나타날 수 있으며(이 경우 레이블에 적용됨), 또는 명령문 자체 바로 앞에 나타날 수 있으며, 이 경우 전체 명령문에 적용됩니다. |
(C++11부터) |
함수 내부에서 선언된 식별자를 가진 레이블은 해당 함수 내의 모든 중첩 블록에서, 자신의 선언 전후를 막론하고 동일한 식별자를 가진 모든 goto 문과 매칭됩니다.
함수 내의 두 레이블은 동일한 식별자를 가질 수 없습니다.
|
레이블은 문에 추가되는 것 외에도 복합문 내 어디에서나 사용할 수 있습니다. |
(since C++23) |
레이블은 unqualified lookup 으로 찾을 수 없습니다: 레이블은 프로그램 내 다른 어떤 엔티티와도 동일한 이름을 가질 수 있습니다.
void f() { { goto label; // label이 나중에 선언되었더라도 스코프 내에 있음 label: // C++23부터 label이 블록 끝에 독립적으로 나타날 수 있음 } goto label; // label은 블록 스코프를 무시함 } void g() { goto label; // 오류: g() 함수 내에서 label이 스코프에 없음 }
제어 흐름 제한 문장
다음 문장들은 control-flow-limited statements 입니다:
- try 블록 의 복합문(compound-statement) .
- 핸들러(handler) 의 복합문(compound-statement) .
|
(C++17부터) |
|
(C++23부터) |
각 제어 흐름 제한 문장
S
에 대해:
-
S내에서 선언된 모든 goto 대상 레이블은S내의 구문에서만 참조될 수 있습니다. -
S내에 나타나는 각 case 또는 default 레이블은S내의 switch statement 와만 연관될 수 있습니다.
표현식 문
표현식 문(expression statement)은 세미콜론이 뒤따르는 표현식입니다.
attr
(선택 사항)
expression
(선택 사항)
;
|
|||||||||
| attr | - | (since C++11) 임의 개수의 attributes 선택적 시퀀스 |
| expression | - | expression (표현식) |
일반적인 C++ 프로그램의 대부분의 문장은 할당이나 함수 호출과 같은 표현식 문장입니다.
표현식이 없는 표현식 문을 null 문(null statement) 이라고 합니다. 주로 for 루프나 while 루프에 빈 본문을 제공하기 위해 사용됩니다. 또한 복합문의 끝에 레이블을 배치하는 데 사용할 수도 있습니다. (C++23 이전)
복합문
복합 문장 또는 블록 은 일련의 문장들을 단일 문장으로 그룹화합니다.
attr
(선택 사항)
{
statement...
(선택 사항)
label...
(선택 사항)
(C++23 이후)
}
|
|||||||||
하나의 문장이 예상되지만, 여러 문장을 순차적으로 실행해야 하는 경우(예를 들어 if 문이나 루프에서), 복합 문(compound statement)을 사용할 수 있습니다:
if (x > 5) // if 문의 시작 { // 블록의 시작 int n = 1; // 선언문 std::cout << n; // 표현식 문 } // 블록의 끝, if 문의 끝
각 복합문은 자체 블록 scope 를 도입합니다. 블록 내부에서 선언된 변수들은 닫는 중괄호에서 역순으로 소멸됩니다:
int main() { // 외부 블록 시작 { // 내부 블록 시작 std::ofstream f("test.txt"); // 선언문 f << "abc\n"; // 표현식 문 } // 내부 블록 종료, f가 플러시되고 닫힘 std::ifstream f("test.txt"); // 선언문 std::string str; // 선언문 f >> str; // 표현식 문 } // 외부 블록 종료, str이 소멸되고 f가 닫힘
|
복합문(compound statement)의 끝에 있는 레이블(label) 은 널 문(null statement)이 뒤따르는 것처럼 취급됩니다. |
(C++23부터) |
선택문
선택문은 여러 제어 흐름 중 하나를 선택합니다.
attr
(선택 사항)
if constexpr
(선택 사항)
(
init-statement
(선택 사항)
condition
)
statement
|
(1) | ||||||||
attr
(선택 사항)
if constexpr
(선택 사항)
(
init-statement
(선택 사항)
condition
)
statement
else
statement
|
(2) | ||||||||
attr
(선택 사항)
switch (
init-statement
(선택 사항)
condition
)
statement
|
(3) | ||||||||
attr
(선택 사항)
if !
(선택 사항)
consteval
compound-statement
|
(4) | (C++23부터) | |||||||
attr
(선택 사항)
if !
(선택 사항)
consteval
compound-statement
else
statement
|
(5) | (C++23부터) | |||||||
반복문
반복문은 일부 코드를 반복적으로 실행합니다.
attr
(선택 사항)
while (
condition
)
statement
|
(1) | ||||||||
attr
(선택 사항)
do
statement
while (
expression
)
;
|
(2) | ||||||||
attr
(선택 사항)
for (
init-statement condition
(선택 사항)
;
expression
(선택 사항)
)
statement
|
(3) | ||||||||
attr
(선택 사항)
for
(
init-statement
(선택 사항)
(C++20부터)
for-range-decl
:
for-range-init
)
statement
|
(4) | (C++11부터) | |||||||
점프 문
점프 문은 제어 흐름을 무조건적으로 전달합니다.
attr
(선택 사항)
break;
|
(1) | ||||||||
attr
(선택 사항)
continue;
|
(2) | ||||||||
attr
(선택 사항)
return
expression
(선택 사항)
;
|
(3) | ||||||||
attr
(선택 사항)
return
braced-init-list
;
|
(4) | (C++11부터) | |||||||
attr
(선택 사항)
goto
identifier
;
|
(5) | ||||||||
참고: 모든 점프 문의 경우, 루프 밖으로, 블록 밖으로, 또는 자동 저장 기간을 가진 초기화된 변수를 지나 다시 되돌아가는 이동은 이동 시작 지점에서 스코프 내에 있지만 이동 대상 지점에서는 스코프 내에 있지 않은 자동 저장 기간을 가진 객체들의 파괴를 수반합니다. 여러 객체가 초기화된 경우, 파괴 순서는 초기화 순서의 역순입니다.
단언문계약 단언.
1)
contract_assert
문.
|
(C++26부터) | |||||||||||||||||||||||
선언문
선언문은 하나 이상의 식별자를 블록에 도입합니다.
| block-declaration | (1) | ||||||||
try 블록
A try 블록은 다른 문장들을 실행할 때 발생하는 예외를 잡습니다.
attr
(선택적)
try
복합문 핸들러-시퀀스
|
(1) | ||||||||
원자적 및 동기화 블록원자적 및 동기화 블록은 트랜잭셔널 메모리 를 제공합니다.
1)
동기화 블록
, 모든 동기화 블록과 단일 전체 순서로 실행됨;
2)
원자적 블록
, 예외 발생 시 중단됨;
3)
원자적 블록
, 예외 발생 시 롤백됨;
4)
원자적 블록
, 예외 발생 시 커밋됨.
|
(TM TS) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
하위 문장
문장의 하위문(substatement) 은 다음 중 하나입니다:
- 레이블 문 의 경우, 해당 statement .
- 복합 문 의 경우, 해당 statement... 의 모든 문.
- 선택 문 의 경우, 해당 statement 또는 compound-statement (C++23부터) 중 하나.
- 반복 문 의 경우, 해당 statement .
문장 S1 가 문장 S2 를 감싸는 경우는 다음 조건 중 하나가 충족될 때입니다:
- S2 는 S1 의 하위 문장입니다.
- S1 이 선택문 또는 반복문이고, S2 가 init-statement 인 경우.
- S1 이 try block 이고, S2 가 그 compound-statement 이거나 handler-seq 내의 어떤 handler 의 compound-statement 인 경우.
- S1 이 문장 S3 을 포함하고, S3 이 S2 를 포함하는 경우.
문장 S1 이 문장 S2 에 포함된다 는 것은 S2 가 S1 을 포함하는 경우를 말합니다.
참고 항목
|
C 문서
참조:
Statements
|