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로 문맥 변환해요. 결과가 true면 statement를 다시 실행해요.
루프 안에서 루프 전체를 끝내야 하면 break 문장을 종료 문장으로 쓸 수 있어요. 현재 반복만 끝내야 하면 continue 문장을 지름길로 쓸 수 있어요.
참고 (Notes)
C++의 전진 보장(forward progress guarantee) 의 일부로, (C++26부터 trivial하지 않은 무한 루프가 아닌) 관찰 가능한 동작 없이 종료되지 않는 루프의 동작은 undefined예요. 컴파일러는 그런 루프를 제거할 수 있어요.
키워드 (Keywords)
관련 키워드는 do와 while이에요.
예제 (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)