statements

statements (문장)

C++ 프로그램에서 문장(statement)은 순서대로 실행되는 코드 조각이에요. 함수 본문은 문장들의 나열로 이루어져 있고, 각 문장은 차례로 실행되며 프로그램의 흐름을 만들어요. 아래 예제처럼 선언 문장, 표현식 문장, return 문장이 한 함수 안에 섞여 있는 것이 전형적인 모습이에요.

출처: cppreference

본문

C++에는 다음 유형의 문장이 있어요.

  • 레이블 문장(Labeled statements)
  • 표현식 문장(Expression statements)
  • 복합 문장(Compound statements)
  • 선택 문장(Selection statements)
  • 반복 문장(Iteration statements)
  • 확장 문장(Expansion statements) — C++26
  • 점프 문장(Jump statements)
  • 단언 문장(Assertion statements) — C++26
  • 선언 문장(Declaration statements)
  • try 블록(try blocks)
  • 원자·동기화 블록(Atomic and synchronized blocks) — TM TS

예를 들어 여러 문장이 한 함수 안에서 어떻게 쓰이는지 볼게요.

int main()
{
    int n = 1;                        // declaration statement
    n = n + 1;                        // expression statement
    std::cout << "n = " << n << '\n'; // expression statement
    return 0;                         // return statement
}

레이블 문장 (Labeled statements)

레이블 문장은 제어 흐름을 위해 문장에 이름(레이블)을 붙이는 문장이에요. 레이블은 goto, switchcase/default 등에서 쓰입니다.

attr (선택) identifier :      (1)
attr (선택) case constexpr :   (2)
attr (선택) default:           (3)
  1. goto의 대상이 되는 식별자 레이블 (identifier label)
  2. switch 문 안에서 쓰는 case 레이블
  3. switch 문 안에서 쓰는 default 레이블

한 함수 안에서 두 식별자 레이블은 같은 이름을 가질 수 없어요. 레이블의 이름은 unqualified lookup으로 찾지 않기 때문에, 프로그램의 다른 어떤 엔티티와 이름이 같아도 괜찮아요. case/default 레이블은 반드시 switch 문 안에 있어야 해요.

C++11부터 레이블 앞에 속성(attribute) 시퀀스를 둘 수 있어요. C++23부터는 레이블을 복합 문장 안의 아무 곳에나(블록 끝에 단독으로도) 둘 수 있어요. C++26부터는 식별자 레이블을 확장 문장 안에 둘 수 없어요.

void f()
{
    label1: 1 + 1; // a labeled statement
    label1: 1 - 1; // Error: cannot repeat label identifiers in the same function
    label2:        // label can appear at the end of a block standalone since C++23
}

표현식 문장 (Expression statements)

문장 단독으로 쓰인 표현식으로, 반복·점프·예외가 끝나지 않으면 실행 후 소멸자에서 사용되는 임시 객체는 문장 끝에서 정리돼요.

복합 문장 (Compound statements)

{ ... }로 묶은 문장 블록이에요. 복합 문장이 실행되면 그 안의 문장들이 순서대로 실행되고, 블록 끝에서 그 안에 선언된 지역 변수들이 역순으로 소멸해요. 블록은 복합 문장 없이도 조건부·반복·점프 문장 등에서 플로우 컨트롤의 범위를 정하는 데 쓰여요.

if (x > 5)          // start of if statement
{                   // start of block
    int n = 1;      // declaration statement
    std::cout << n; // expression statement
}                   // end of block, end of if statement
int main()
{ // start of outer block
    {                                // start of inner block
        std::ofstream f("test.txt"); // declaration statement
        f << "abc\n";                // expression statement
    }                                // end of inner block, f is flushed and closed
}

선택 문장 (Selection statements)

조건에 따라 실행 경로를 고르는 문장으로, ifswitch가 있어요. constexpr if는 컴파일 타임 분기를, consteval if는 즉시 평가(immediate) 분기를 만들어요.

반복 문장 (Iteration statements)

while, do-while, for, range-for가 있어요. 반복적으로 코드 블록을 실행합니다.

점프 문장 (Jump statements)

break, continue, goto, return과 예외를 유발하는 throw가 있어요. 실행 흐름을 다른 곳으로 건너뜁니다.

선언 문장 (Declaration statements)

블록 안에서 변수를 선언하면 그 선언이 선언 문장이 돼요. 변수의 수명(lifetime)은 선언 시점부터 블록(또는 constexpr if 분기) 끝까지예요.

try 블록 (try blocks)

예외를 처리하는 블록이에요. try 블록과 그에 붙은 catch 핸들러를 구성합니다. try 블록의 복합 문장과 핸들러의 복합 문장, constexpr if의 모든 부속 문장은 제어 흐름이 제한되는 문장(control-flow-limited statements)으로 분류돼요.

더 알아보기 (Learn more)