do-while 반복문

do-while 반복문 (do-while loop)

do-while 반복문은 문장(statement)을 조건과 상관없이 최소 한 번은 실행하고, 그 후에는 조건이 참인 동안 반복하는 제어문이에요. "일단 실행하고 조건을 검사한다"는 점에서, 조건을 먼저 검사하는 while과 달라요.

출처: cppreference

본문

문법 (Syntax)

attr(선택) do statement while ( expression ) ;
  • attr — (C++11부터) 임의 개수의 속성.
  • expression — 임의의 표현식.
  • statement — 문장 (보통 복합문).

설명 (Explanation)

제어 흐름이 do 문장에 도달하면, 그 statement무조건 먼저 실행돼요.

그리고 statement 실행이 끝날 때마다 expression을 평가하고 bool로 문맥 변환해요. 결과가 truestatement를 다시 실행해요.

루프 안에서 루프 전체를 끝내야 하면 break 문장을 종료 문장으로 쓸 수 있어요. 현재 반복만 끝내야 하면 continue 문장을 지름길로 쓸 수 있어요.

참고 (Notes)

C++의 전진 보장(forward progress guarantee) 의 일부로, (C++26부터 trivial하지 않은 무한 루프가 아닌) 관찰 가능한 동작 없이 종료되지 않는 루프의 동작은 undefined예요. 컴파일러는 그런 루프를 제거할 수 있어요.

키워드 (Keywords)

관련 키워드는 dowhile이에요.

예제 (Example)

do-while이 언제 유용한지 두 가지 상황으로 보여줄게요. 첫째는 조건 검사 전에 본문을 적어도 한 번 돌려야 하는 경우, 둘째는 본문이 실행되면서 조건이 바뀌는 경우예요.

#include <algorithm>
#include <iostream>
#include <string>

int main()
{
    int j = 2;
    do // 복합문이 루프 본문
    {
        j += 2;
        std::cout << j << ' ';
    }
    while (j < 9);
    std::cout << '\n';

    // do-while 루프가 쓰이는 흔한 상황
    std::string s = "aba";
    std::sort(s.begin(), s.end());

    do std::cout << s << '\n'; // 표현식 문장이 루프 본문
    while (std::next_permutation(s.begin(), s.end()));
}

출력:

4 6 8 10
aab
aba
baa

첫 번째 루프는 j가 2에서 시작해 2씩 커져 4, 6, 8, 10까지 출력해요. 조건 j < 9본문을 먼저 실행한 뒤 검사되므로, j가 8일 때 본문을 실행하고 나서야 10이 되고 조건이 거짓이 되어 멈춰요. 두 번째 루프는 next_permutation의 성공 여부를 while에서 검사하며, 첫 순열 aab는 일단 출력하고 시작해요. 이처럼 결과를 먼저 보여주고 계속할지 묻는 패턴이 do-while의 전형적인 쓰임새예요.

더 알아보기 (Learn more)

  • while 반복문 — 조건을 먼저 검사하는 반복문. do-while과 대비해서 보면 좋아요. (cppreference)
  • for 반복문 — 초기화·조건·증감을 한 줄로 묶은 반복문. (cppreference)
  • 범위 기반 for 반복문 (C++11) — 컨테이너를 순회하기 위한 반복문. (cppreference)