Namespaces
Variants

Statements

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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)
1) goto 대상;
2) case 레이블 in a switch 문;
3) default 레이블 in a switch 문.

속성 시퀀스 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 입니다:

(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부터)
1) if 문;
2) if 문과 else 절;
3) switch 문;
4) consteval if 구문;
5) consteval if else 절을 포함한 statement.

반복문

반복문은 일부 코드를 반복적으로 실행합니다.

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부터)
1) while 루프;
2) do-while 루프;
3) for 루프;
4) range for 루프.

점프 문

점프 문은 제어 흐름을 무조건적으로 전달합니다.

attr  (선택 사항) break; (1)
attr  (선택 사항) continue; (2)
attr  (선택 사항) return expression  (선택 사항) ; (3)
attr  (선택 사항) return braced-init-list ; (4) (C++11부터)
attr  (선택 사항) goto identifier ; (5)
1) break 문;
2) continue 문;
3) return 선택적 표현식과 함께 사용하는 문;
4) return 문에서 list initialization 사용;
5) goto 문.

참고: 모든 점프 문의 경우, 루프 밖으로, 블록 밖으로, 또는 자동 저장 기간을 가진 초기화된 변수를 지나 다시 되돌아가는 이동은 이동 시작 지점에서 스코프 내에 있지만 이동 대상 지점에서는 스코프 내에 있지 않은 자동 저장 기간을 가진 객체들의 파괴를 수반합니다. 여러 객체가 초기화된 경우, 파괴 순서는 초기화 순서의 역순입니다.

단언문

계약 단언.

contract_assert attr  (선택적) ( predicate ) ;
(C++26부터)

선언문

선언문은 하나 이상의 식별자를 블록에 도입합니다.

block-declaration (1)
1) 자세한 내용은 Declarations Initialization 를 참조하십시오.

try 블록

A try 블록은 다른 문장들을 실행할 때 발생하는 예외를 잡습니다.

attr  (선택적) try 복합문 핸들러-시퀀스 (1)
1) 자세한 내용은 try 블록 을 참조하십시오.


원자적 및 동기화 블록

원자적 및 동기화 블록은 트랜잭셔널 메모리 를 제공합니다.

synchronized compound-statement (1) (TM TS)
atomic_noexcept compound-statement (2) (TM TS)
atomic_cancel compound-statement (3) (TM TS)
atomic_commit compound-statement (4) (TM TS)
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