do-while 루프

do-while 루프 (do-while loop)

조건을 확인한 뒤 본문을 실행하는 while과 달리, do-while은 본문을 먼저 한 번 실행하고 나서 조건을 확인해요. "어떤 작업을 적어도 한 번은 수행해야 하고, 그다음 조건에 따라 반복할지 말지를 결정한다" 같은 흐름이 필요할 때 참 유용해요. 이 페이지에서 do-while의 구문과 동작을 볼게요.

출처: cppreference

본문

do-while은 조건 표현식의 값이 거짓이 될 때까지 문을 반복해서 실행해요. 조건 검사는 각 반복 후에 일어나요.

구문 (Syntax)

attr-spec-seq (optional) do statement while ( expression ) ;
항목 설명
expression 스칼라 타입의 어떤 표현식. 각 반복 후에 평가되며, 0과 같은 값으로 비교되면 루프를 빠져나가요.
statement 어떤 문. 보통 루프 본문인 복합문(compound statement).
attr-spec-seq (C23) 루프 문에 적용되는 선택적인 속성 목록

설명 (Explanation)

do-while 문은 제어 표현식(controlling expression)이라고도 부르는 expression이 0과 같게 비교될 때까지 statement(루프 본문)를 반복해서 실행해요. 이 반복은 루프 본문이 정상적으로 진입됐든, gotostatement 중간으로 점프해서 진입됐든 상관없이 일어나요.

expression의 평가는 statement를 각각 실행한 뒤(정상 진입이든 goto든)에 일어나요. 제어 표현식을 루프 본문 이전에 평가해야 한다면 while 루프for 루프를 쓰면 돼요.

루프 실행을 어떤 지점에서 종료해야 한다면 break 문을 종료 문으로 쓸 수 있어요.

루프 본문 끝에서 실행을 계속해야 한다면 continue 문을 단축키로 쓸 수 있어요.

루프의 문이나 표현식 어느 부분에도 관찰 가능한 동작(observable behavior: I/O, volatile 접근, 원자적·동기화 연산)이 없는 무한 루프를 가진 프로그램은 정의되지 않은 동작이에요. 이는 컴파일러가 종료를 증명하지 않고도 관찰 불가능한 루프를 모두 최적화해 없앨 수 있게 하기 위함이에요. 유일한 예외는 expression이 상수 표현식인 루프예요. do {...} while(true);는 항상 무한 루프예요.

다른 모든 선택·반복 문과 마찬가지로, do-while 문은 블록 스코프를 설정해요. expression에 도입된 어떤 식별자도 문이 끝나면 스코프를 벗어나요. (since C99)

주의 (Notes)

불리언과 포인터 표현식이 루프 제어 표현식으로 자주 쓰여요. 불리언 값 false와 어떤 포인터 타입의 널 포인터 값은 0과 같게 비교돼요.

키워드 (Keywords)

do, while

예제 (Example)

#include <stdio.h>
#include <stdlib.h>
enum { SIZE = 8 };
int main(void)
{
    // 간단한 예
    int array[SIZE], n = 0;
    do array[n++] = rand() % 2; // 루프 본문은 단일 표현식 문
    while(n < SIZE);
    puts("Array filled!");
    n = 0;
    do { // 루프 본문은 복합문
        printf("%d ", array[n]);
        ++n;
    } while (n < SIZE);
    printf("\n");

    // K&R itoa()의 루프. do-while 루프는 항상 생성할 숫자가
    // 하나 이상 있기 때문에 사용됨
    int num = 1234, i=0;
    char s[10];
    do s[i++] = num % 10 + '0'; // 역순으로 다음 숫자를 얻음
    while ((num /= 10) > 0);
    s[i] = '\0';
    puts(s);
}

가능한 출력:

Array filled!
1 0 1 1 1 1 0 0
4321

더 알아보기