소년코딩

06.04 - while 문 (while statement)

while 문은 C++에서 제공하는 네 가지 루프 중 가장 단순하면 if 문과 매우 유사하다.

while (expression)
    statement;

while 문은 while 키워드를 사용하여 선언된다. while 문이 실행되면 표현식이 평가된다. 표현식이 참(true: 0이 아닌)으로 평가되면 명령문이 실행된다.

그러나 if 문과 달리 명령문 실행이 끝나면 while 명령문의 맨 위 표현식으로 돌아가서 프로세스가 반복된다.

간단한 while 루프(loop)를 살펴보자. 다음 프로그램은 0부터 9까지 모든 숫자를 출력한다.

#include <iostream>

int main()
{
    int count = 0;
    while (count < 10)
    {
        std::cout << count << " ";
        ++count;
    }
    std::cout << "done!";

    return 0;
}

// This outputs:
// 0 1 2 3 4 5 6 7 8 9 done!

위 프로그램이 무엇을 하는지 자세하게 살펴보자. 첫째. count가 0이므로 0 < 10true로 평가되어 while 문이 실행된다. 첫 번째 문은 0을 출력하고, 두 번째 문은 count를 2로 증가시킨다. 그런 다음 while 문의 맨 위 표현식으로 돌아간다. 1 < 10true로 평가되므로 while 문이 다시 실행된다. while 문은 count가 10이 될 때까지 반복적으로 실행되다가, 10 < 10에서 false를 평가하고 루프가 종료된다.

while 문이 실행되지 않을 수도 있다.

#include <iostream>

int main()
{
    int count = 15;
    while (count < 10)
    {
        std::cout << count << " ";
        ++count;
    }
    std::cout << "done!";

    return 0;
}

표현식 15 < 10은 즉시 false로 평가되므로, while 문을 건너띈다.


무한 루프 (Infinite loops)

반면 표현식이 항상 true로 평가되는 while 루프는 영원히 실행된다. 이를 무한 루프(infinite loop)라고 한다.

#include <iostream>

int main()
{
    int count = 0;
    while (count < 10) // this condition will never be false
        std::cout << count << " "; // so this line will repeatedly execute

    return 0; // this line will never execute
}

이 프로그램에서는 count가 절대 증가하지 않으므로 count < 10이 항상 true로 평가된다. 결과적으로 루프는 절대로 종료되지 않고 "0 0 0 0 0 ..."이 영원히 출력된다.

다음과 같이 의도적으로 무한 루프를 선언할 수 있다.

while (1) // or while (true)
{
  // this loop will execute forever
}

무한 루프를 종료하는 방법은 return 문, break 문, exit 문, goto 문 또는 예외가 발생하거나 프로그램을 종료하는 것이다.


루프 변수 (Loop variables)

종종 루프가 특정 횟수만큼 실행되기를 원할 수 있다. 이를 위해 일반적으로 카운터(counter)라고 하는 루프 변수(loop variable)를 사용한다. 루프 변수는 루프가 실행된 횟수를 세는 목적으로 정의된 정수 변수다.

루프 변수는 i, j 또는 k와 같은 간단한 이름으로 지정하는 경우가 많다. 그러나 이렇게 간단한 이름으로 지정하면 큰 문제가 있다. 프로그램에서 루프 변수가 사용되는 위치를 알고 싶어 ij 같은 이름을 검색하면 프로그램의 절반을 차지할 수도 있다. 따라서 루프 변수 이름을 count와 같이 의미 있는 고유한 이름을 사용하는 게 더 좋다.

#include <iostream>

int main()
{
    int count = 10;

    // count from 10 down to 0
    while (count >= 0)
    {
        if (count == 0)
            std::cout << "blastoff!";
        else
            std::cout << count << " ";
        --count;
    }

    return 0;
}

Iteration

루프가 실행될 때마다 이를 이터레이션(반복: iteration)이라고 한다.

루프 본체는 일반적으로 블록(block)이며 각 반복과 함께 해당 블록이 입력 및 종료되기 때문에 루프 본체 내부에 선언된 변수는 생성된 다음 반복될 때마다 소멸한다. 다음 예에서 변수 x는 5번 생성되고 소멸한다.

#include <iostream>

int main()
{
    int count = 1;
    int sum = 0; // sum is declared up here because we need it later (beyond the loop)

    while (count <= 5) // iterate 5 times
    {
        int x; // x is created here with each iteration

        std::cout << "Enter integer #" << count << ':';
        std::cin >> x;

        sum += x;

        // increment the loop counter
        ++count;
    } // x is destroyed here with each iteration

    std::cout << "The sum of all numbers entered is: " << sum;

    return 0;
}

위 예제의 경우 성능 문제가 발생할 수 있으므로 루프 이전에 변수 x를 정의하는 것이 좋다.


Nested loops

루프를 다른 루프 안에 중첩할 수도 있다. 다음 예제에서 내부 르프와 외부 루프에는 각각 고유한 카운터가 있다. 그러나 내부 루프에 대한 표현식은 외부 루프 카운터를 사용한다.

#include <iostream>

// Loop between 1 and 5
int main()
{
    int outer = 1;
    while (outer <= 5)
    {
        // loop between 1 and outer
        int inner = 1;
        while (inner <= outer)
            std::cout << inner++ << " ";

        // print a newline at the end of each row
        std::cout << "\n";
        ++outer;
    }

    return 0;
}
This program prints:
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

cpp 번역: 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/55-while-statements/ 입니다.

댓글 로드 중…

블로그 정보

소년코딩 - 소년코딩

소년코딩, 자바스크립트, C++, 물리, 게임 코딩 이야기

최근에 게시된 이야기