본문 바로가기

C언어/C언어 문법

[C언어] 반복문 (for문, while문)

728x90
반응형

반복문

 

하나 이상의 문장을 특정 조건에서 여러 번 반복하고 싶을 때 반복문이 사용된다.

 

반복문에는 while문과 for문이 있다.

 

반복문에서 중괄호 안에 반복을 원하는 문장을 작성하는 형식으로 사용할 수 있다.

 

또한 코드를 보기 편하게 하기 위해 보통 중괄호 안의 코드를 들여 쓰기를 한다.

 

 

 

 

 

 

for문

 

for 문은 초기식, 조건식, 증감식을 사용해서 원하는 내용을 반복할 수 있다.

 

초기식이란 조건에 사용할 문자를 선언, 혹은 초기화할 수 있는 식이다.

 

조건식이란 반복을 원하는 조건을 작성할 수 있는 식으로 조건값이 false 가 되면 반복을 중지하게 된다.

 

증감식이란 for 문 반복을 한 번 끝낼 때마다 실행하는 문장으로 조건을 변경시킬 때 사용한다.

 

아래 그림과 같이 정리 할 수 있다.

 

 

 

 

 

 

위 그림의 코드는 num이 0에서 시작하여 반복이 한 번 끝날 때마다 1씩 증가하고 15보다 작을 때 반복을 실행한다.

 

따라서 중괄호 안에 있는 Hello World! 는 총 15번 반복 출력된다.

 

그런데 컴파일러에 따라 초기식에서 변수 선언을 허용하지 않는 경우도 있다.

 

그런 경우에는 다음 코드와 같이 변수를 for 문 이전에 먼저 선언하고 사용을 해주어야 한다.

 

 

#include <stdio.h>

int main ()
{
    int num;
    for (num=0; num<15; num++)
    {
        printf("Hello World!%d\n", num);
    }
    return 0;
}
 

 

 

 

 

 

for 문에서는 초기식, 조건식, 증감식 중 필요하지 않은 식은 생략해도 괜찮다.

 

따라서 위 코드를 다음과 같은 코드로 바꿔 쓸 수 있다.

 

#include <stdio.h>

int main ()
{
    int num = 0;
    for ( ; num<15; )
    {
        printf("Hello World!%d\n", num);
        num++;
    }
    return 0;
}
 

 

 

 

 

 

for문 무한루프

 

for 문안의 내용을 무한 번 반복하게 작성할 수도 있다.

 

먼저 조건을 항상 일치하게 작성해 주는 방법이 있다.

 

위 코드에서 num++를 해주지 않으면 num은 항상 0일 것이고 15 이상이 될 일이 절대 없을 것이다.

 

따라서 아래 코드처럼 작성하면 "Hello World!"를 무한 번 반복하는 코드가 된다.

 

#include <stdio.h>

int main ()
{
    int num = 0;
    for ( ; num<15; )
    {
        printf("Hello World!%d\n", num);
    }
    return 0;
}

 

 

 

 

 

for 문은 변수를 사용하지 않고도 무한 루프를 만들 수 있다.

 

조건식이 필수적이지 않음을 이용하는 것이다.

 

for 문은 조건식에 아무것도 작성하지 않으면 중괄호 안의 코드를 무한 번 반복한다.

 

따라서 다음 코드도 "Hello World!"를 무한 번 반복하는 코드이다.

 

#include <stdio.h>

int main ()
{
    for ( ; ; )
    {
        printf("Hello World!\n");
    }
    return 0;
}
 

 

 

 

 

 

for문 중첩

 

for 문은 중첩해서 사용이 가능하다. 즉 for 문안에 for 문을 사용할 수 있다.

 

물론 아래에서 소개할 while 문에서도 중첩은 가능하다.

 

while 문에 for 문을 중첩한다던가 for 문에 while 문을 중첩이 가능한 것처럼 중첩에 제약은 없다.

 

중첩을 쉽게 이해하기 위해 for 문 중첩을 사용하여 구구단을 출력하는 코드를 작성해 보겠다.

 

#include <stdio.h>

int main ()
{
    int dan = 0;
    int mul = 0;
    for (dan=2; dan<=9; dan++)
    {
        for (mul=1; mul<=9; mul++)
        {
            printf("%d x %d = %d\n", dan, mul, dan*mul);
        }   
    }
    return 0;
}
 

 

 

 

 

 

 

 

 

 

 

 

 

while문

 

while 문은 초기식과 증감식 없이 조건식만을 사용할 수 있다.

 

for 문에서는 조건식을 사용하지 않아도 문제가 없지만 while 문은 조건식이 꼭 필요하다.

 

따라서 조건식에 필요한 문자를 먼저 선언해야 하며 증감식을 사용할 수 없으니 중괄호 안에서 반복할 때

증감식을 작성해 주어야 한다.

 

"Hello World!"를 15번 출력하는 코드를 작성해 보겠다.

 

#include <stdio.h>

int main ()
{
    int num = 0;
    while (num<15) // num이 15보다 작을 때 출력
    {
        printf("Hello Wolrd!");
        num++; // num이 1 증가
    }
    return 0;
}
 

 

위 코드에서 while 문은 num이 15보다 작을 때 반복되며 num이 15 이상이 되면 while 문을 빠져나오게 된다.

 

num 은 중괄호 안에서 작성된 코드의 내용대로 while 문을 한 번 반복할 때마다 1씩 증가한다.

 

따라서 총 15번의 while이 반복되면 num은 15가 되고 while 문은 작동하지 않게 되어

"Hello World!"를 15번 출력하게 되는 것이다.

 

 

 

 

 

while문 무한루프

 

while 문안의 내용도 무한 번 반복하게 작성할 수도 있다.

 

for 문 무한 루프를 설명할 때처럼 조건식이 항상 일치하지 않게 작성하는 방법이 있다.

 

while 문은 조건식이 필수적으로 필요하지만 변수를 사용하지 않고도 무한 루프를 만들 수 있는 방법이 있다.

 

while(1)을 이용하는 것이다.

 

앞서 논리연산자를 소개할 때 false는 0 값을 true는 0 이외의 값을 반환한다고 하였다.

 

따라서 while의 조건식에 0 이외의 값을 넣게 되면 항상 조건이 성립하게 되어서 while 문을 무한 루프로 만들 수 있다.

 

통상적으로는 while(1)을 사용하나 while(2), while(3) 도 가능하고

while('a'), while("abc")처럼 문자나 문자열을 사용하는 것도 가능하다.

 

그러나 C언어에서는 기본적으로 bool형을 지원하지 않기 때문에 while(true)로 사용하는 것은

다른 방법을 사용해야 한다. 이 방법은 나중에 bool 자료형에 대해서 소개하면서 설명하겠다.

 

따라서 우선 while(1) 을 이용하여 무한 루프를 만드는 코드를 작성해 보겠다.

 

#include <stdio.h>

int main ()
{
    while (1)
    {
        printf("Hello Wolrd!\n");
    }
    return 0;
}
 

 

 

 

 

 

 

중괄호 생략

 

반복문에서 반복하고 싶은 내용이 한 줄 일 경우에는 중괄호를 생략할 수 있다.

 

아까 for 문을 소개할 때 작성했던 구구단 코드를 예시로 들면 printf 함수가 포함된 for 문은

 

중괄호 안에 한 줄만 있으므로 중괄호를 생략할 수 있다.

 

따라서 for 문을 다음과 같이 사용할 수 있다.

 

#include <stdio.h>

int main ()
{
    int dan = 0;
    int mul = 0;
    for (dan=2; dan<=9; dan++)
    {
        for (mul=1; mul<=9; mul++)
            printf("%d x %d = %d\n", dan, mul, dan*mul);
    }
    return 0;
}
 

 

 

 

물론 while 문도 중괄호 생략이 가능하다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형