while 루프

while 루프 (while 문)

조건이 참인 동안 같은 작업을 계속 반복하고 싶다면 while 문을 쓰면 돼요. 표현식의 값이 0이 될 때까지 문장을 반복해서 실행하고, 검사는 매 반복 맨 앞에서 일어나요. 그래서 조건이 처음부터 거짓이면 루프 본문은 한 번도 실행되지 않아요.

출처: cppreference

본문

문법

attr-spec-seq(optional) while ( expression ) statement
자리 의미
expression 스칼라 타입의 모든 표현식. 매 반복마다 평가되며, 0과 같으면 루프를 빠져나와요.
statement 루프 본문으로 쓰이는 모든 문장. 보통 복합문(중괄호 블록)이에요.
attr-spec-seq (C23) 루프 문장에 적용되는 속성들의 선택적 목록.

동작 방식

while 문은 statement(일명 루프 본문)를 expression(일명 제어 표현식)의 값이 0과 같아질 때까지 반복해서 실행해요. 이 반복은 루프 본문에 정상적으로 진입했든, goto로 문장 중간에 들어왔든 관계없이 일어나요.

expression의 평가는 statement가 실행되기 전에 일어나요 (goto로 진입한 경우는 제외). 제어 표현식을 루프 본문 뒤에 평가해야 한다면 do-while 루프를 쓰면 돼요.

루프 실행을 어느 시점에서 끝내야 한다면 break 문을 종료 문장으로 쓸 수 있어요. 루프 본문 끝에서 다음 반복으로 넘어가야 한다면 continue 문을 단축키로 쓸 수 있어요.

아무 관측 가능한 행동(I/O, volatile 접근, 원자 연산, 동기화 연산)이 없는 무한 루프는 종료되지 않으면 **정의되지 않은 동작(undefined behavior)**이에요. 덕분에 컴파일러는 루프가 진짜로 종료한다는 걸 증명하지 않아도, 관측되지 않는 루프를 전부 최적화해서 없앨 수 있어요. 유일한 예외는 expression이 상수 표현식인 경우인데, while(true)는 항상 의도된 무한 루프예요.

다른 선택·반복 문장들과 마찬가지로, while 문은 블록 스코프를 만들기 때문에 expression에서 도입한 식별자는 문장을 벗어나면 사라져요. (C99부터)

참고

루프 제어 표현식에는 불리언 표현식이나 포인터 표현식이 자주 쓰여요. 불리언 값 false와 모든 포인터 타입의 널 포인터 값은 0과 같이 비교되기 때문이죠.

키워드

while

예제

여기서는 while 루프의 세 가지 쓰임을 확인해 볼게요. 간단한 배열 채우기, 인덱스를 늘려가며 출력하기, 그리고 널 종료 문자열을 복사하는 고전적인 strcpy() 흐름까지요.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

enum { SIZE = 8 };

int main(void)
{
    // trivial example
    int array[SIZE], n = 0;

    while(n < SIZE) array[n++] = rand() % 2;
    puts("Array filled!");
    n = 0;
    while(n < SIZE) printf("%d ", array[n++]);
    printf("\n");

    // classic strcpy() implementation
    // (copies a null-terminated string from src to dst)
    char src[] = "Hello, world", dst[sizeof src], *p = dst, *q = src;
    while((*p++ = *q++)) // double parentheses (that are not strictly necessary)
                         // used to suppress warnings, ensuring that this is an
                         // assignment (as opposed to a comparison) by intention,
                         // whose result is used as a truth value
        ; // null statement
    puts(dst);
}

출력:

Array filled!
1 0 1 1 1 1 0 0 
Hello, world

더 알아보기

  • 조건을 나중에 검사하는 반복문은 do-while 루프예요.
  • 초기화·조건·증감을 한 곳에 모은 for 문과 비교해 보면 각 루프의 쓰임이 더 또렷해져요.
  • 루프를 중단하거나 다음 반복으로 넘기는 break / continue도 함께 보면 좋아요.