break 문(break statement)

break 문(break statement)

반복문이나 switch 블록 한가운데서 흐름을 끊고 빠져나가고 싶을 때 쓰는 것이 break예요. break특정 둘러싸는 문(statement)을 종료해요.

출처: cppreference

본문

문법

속성(optional) break ;
자리 의미
속성(attr) (C++11부터) 임의 개수의 속성

동작 방식(Explanation)

break 문은 반드시 다음 문들 중 하나에 둘러싸여 있어야 해요.

  • 반복 문(iteration statements): for, 범위 기반 for(range-for), while, do-while
    • 확장 문(expansion statements, template for): (C++26부터)
  • switch

break 문을 실행하면 그중 가장 안쪽의 둘러싸는 문이 종료되고, 그 다음 제어는 종료된 문 뒤에 오는 문(있을 경우)으로 넘어가요.

주의할 점(Notes)

블록을 빠져나갈 때와 마찬가지로, 둘러싸는 복합 문이나 루프/switch의 조건에서 선언된 모든 자동 저장 객체는, 구성된 순서의 역순으로 파괴된 뒤에 둘러싸는 루프 다음의 첫 줄이 실행돼요.

break 문 하나로 여러 겹의 중첩 루프를 한 번에 빠져나갈 수는 없어요. 그럴 때는 goto 문을 쓸 수 있어요.

예제

여기서는 switch 안의 break와 중첩 루프에서의 break가 실제로 어디까지 영향을 미치는지 확인해 볼게요.

#include <iostream>

int main()
{
    int i = 2;
    switch (i)
    {
        case 1: std::cout << "1";   // <---- 경고 가능: fall through
        case 2: std::cout << "2";   // 이 case 레이블부터 실행 시작 (+경고)
        case 3: std::cout << "3";   // <---- 경고 가능: fall through
        case 4:                     // <---- 경고 가능: fall through
        case 5: std::cout << "45";  //
                break;              // 이후 문의 실행이 종료됨
        case 6: std::cout << "6";
    }
    std::cout << '\n';
    
    for (char c = 'a'; c < 'c'; c++)
    {
        for (int i = 0; i < 5; i++)      // break의 영향을 받는 건 이 루프뿐
        {                                //
            if (i == 2)                  //
                break;                   //
            std::cout << c << i << ' ';  //
        }
    }
    std::cout << '\n';
}

가능한 출력:

2345
a0 a1 b0 b1

첫 출력을 보면, switch에서 case 2:부터 시작해서 case 5:break까지 "2345"가 한 줄로 이어져 나와요. 중첩 루프 쪽은 안쪽 forbreak로 종료되고 바깥 for는 그대로 돌아서 a0 a1 b0 b1이 출력돼요.

더 알아보기

  • [[fallthrough]](C++17): 이전 case 레이블에서의 낙하(fall through)가 의도적임을 알려서, fall-through에 경고하는 컴파일러가 진단하지 않도록 하는 속성 지정자(attribute specifier).