언어/C,C++

C Language Chapter 6. 반복문

깜냥c 2020. 8. 3. 16:40

안녕하세요

 

저번에는 C언어의 조건문에 대해서 배웠습니다.

 

이번 글은 기본적인 C언어의 반복문에 관해서 알아보도록 하겠습니다!

 


C언어에서 반복문은 for, while, do while을 사용하여 나타냅니다.

 

1. for

 

for문의 경우 일정 횟수를 반복하려고 할 때 주로 사용됩니다.

 

for문의 구조는 다음과 같습니다.

 

for(초기화; 조건; 실행){

    명령;

}

 

초기화 부분은, for문에서 임시로 사용할 변수를 선언 및 초기화 하는 것으로 처음 한번만 실행됩니다.

 

이 때 선언된 변수는 for문 밖에서는 사용할 수 없으며 for문이 끝난 후 사라집니다.

 

조건 부분은 말 그대로 조건을 정하여 for문을 계속 실행할지 말지를 결정합니다.

 

실행 부분은, for문이 한 번 끝날때 마다 주어진 실행코드를 수행합니다.

 

말로만 이해하기에는 어려우니, 예제를 가지고 for문의 실행흐름을 살펴보도록 하겠습니다.

 

#include <stdio.h>

int main()
{
    for(int i=0; i<10; i++)
    {
    	printf("Hello World!\n");
    }
}

먼저 정수형 변수 i를 선언하고 0으로 초기화 합니다.

 

그리고 i<10 조건을 만족하면 Hello World!를 출력하고 i값을 1 증가 시킵니다.

 

이후 i=1에서 i=9까지 증가하다가 i=10 되었을 때 i<10 조건을 만족하지 못하므로 for문을 빠져나오게 됩니다.

 

for문에서 초기화한 i는 for문이 끝나자마자 없어지기에 따로 선언하지 않는 이상 사용이 불가합니다.

 

#include <stdio.h>

int main()
{
    for(int i=0; i<10; i++)
    {
    	printf("Hello World!\n");
    }
    printf("i = %d\n",i);
}
prog.c: In function ‘main’:
prog.c:9:23: error: ‘i’ undeclared (first use in this function)
     printf("i = %d\n",i);
                       ^
prog.c:9:23: note: each undeclared identifier is reported only once for each function it appears in

 

 

for문의 초기화, 조건, 실행 부분은 생략가능합니다.

 

즉, for(; i<10; i++) 등으로 나타낼 수 있습니다.

 

int i=0
for(; i<10; i++)
{
    printf("Hello World!\n");
}

for(int i=0; ; i++)
{
    printf("Hello World!\n");
}

for(;;)
{
    printf("Hello World!\n");
}

 

다만, 조건식이 없는 for문의 경우 무한루프에 빠지게 되므로 for문 내부에 if-break문을 사용하여 빠져나올 수 있게 해주어야 합니다.

 

for(int i=0; ; i++)
{
    if(i >= 10)
        break;
    printf("Hello World!\n");
}

int i=0;
for(;;)
{
    if(i >= 10)
        break;
    printf("Hello World!\n");
}

 

*이중 for문

 

for문은 이중, 삼중으로 겹쳐서 사용이 가능합니다.

 

대표적으로 구구단을 구현할 때 이중 for문이 사용됩니다.

 

#include <stdio.h>

int main()
{
    for(int i=1; i<10; i++)
    {
    	for(int j=1; j<10; j++)
            printf("%d x %d = %d\n",i,j,i*j);
    }
    return 0;
}

 

*for문 내부 변수

 

위에서 for문에서 선언한 변수의 경우 for문 안에서만 사용할 수 있다고 설명드렸습니다.

 

그럼 만약에, 외부에서 int i;로 선언하고 for문에서 같은 이름으로 int i; 선언하여 사용하면 어떻게 될까요?

 

#include <stdio.h>

int main(void) {

	int i=0;
	printf("case 1\n");
	for(int i=0; i<10; i++){
		printf("for : i = %d\n",i);
	}
	printf("main : i = %d\n",i);
	
	printf("case 2\n");
	for(; i<10; i++){
		printf("for : i = %d\n",i);
	}
	printf("main : i = %d\n",i);
	return 0;
}

 

위의 코드를 실행하면 결과는 다음과 같이 나옵니다.

 

case 1
for : i = 0
for : i = 1
for : i = 2
for : i = 3
for : i = 4
for : i = 5
for : i = 6
for : i = 7
for : i = 8
for : i = 9
main : i = 0

case 2
for : i = 0
for : i = 1
for : i = 2
for : i = 3
for : i = 4
for : i = 5
for : i = 6
for : i = 7
for : i = 8
for : i = 9
main : i = 10

 

 

case1에서는 for문에서 i값을 초기화 시켰을 경우, for문의 내부에서는 초기화 시킨 i값을 사용합니다.

 

for문의 i++;식은 외부 변수 i값에 영향을 주지 않으며 내부의 i값은 for문이 끝나자마자 없어집니다. 따라서 main : i = 0을 출력합니다.

 

하지만 case 2의 경우 for문에서 i를 초기화 시키지 않았기에, 외부의 i값을 사용하며 i++;은 외부 변수 i값에 영향을 줍니다.

 

이후 i 가 10일 때 for문을 빠져나오게 되며, 따라서 main : i = 10을 출력합니다.

 

**이중 for문의 내부 변수

 

이중 for문의 경우, 각 for문의 내부 변수가 같으면 어떻게 될까요?

 

#include <stdio.h>

int main()
{
    for(int i=0; i<3; i++)
    {
    	for(int i=0; i<3; i++)
    		printf("for2 : i = %d\n",i);
    	printf("for1 : i = %d\n",i);
    }
    return 0;
}

 

for2 : i = 0
for2 : i = 1
for2 : i = 2
for1 : i = 0
for2 : i = 0
for2 : i = 1
for2 : i = 2
for1 : i = 1
for2 : i = 0
for2 : i = 1
for2 : i = 2
for1 : i = 2

 

 

 

#include <stdio.h>

int main()
{
    for(int i=0; i<3; i++)
    {
    	for(; i<3; i++)
    		printf("for2 : i = %d\n",i);
    	printf("for1 : i = %d\n",i);
    }
    return 0;
}

 

for2 : i = 0
for2 : i = 1
for2 : i = 2
for1 : i = 3

 

결과를 통해, for문에서 초기화 시켜주었다면 각 i값은 독립적인 것을 알 수 있습니다.

 

하지만, 구구단 같이 이중 for문을 사용하는 경우는 내부 변수를 다르게 해주어야 합니다.

 

만약 내부 변수를 같게 한다면, i*i를 할 경우 (외부 for문 i * 내부 for문 i)가 아닌 (내부 for문 i * 내부 for문 i)를 계산하기 때문입니다.

 

#include <stdio.h>

int main()
{
    for(int i=0; i<10; i++)
    {
    	for(int i=1; i<10; i++)
            printf("%d x %d = %d\n",i,i,i*i);
    }
    return 0;
}

 

1 x 1 = 1
2 x 2 = 4
3 x 3 = 9
4 x 4 = 16
5 x 5 = 25
6 x 6 = 36
7 x 7 = 49
8 x 8 = 64
9 x 9 = 81
...
1 x 1 = 1
2 x 2 = 4
3 x 3 = 9
4 x 4 = 16
5 x 5 = 25
6 x 6 = 36
7 x 7 = 49
8 x 8 = 64
9 x 9 = 81

 

결과에서, 처음 외부 for문의 i 값은 0이지만, 출력 값은 내부 for문의 i 값인 1을 나타내는 것을 확인할 수 있습니다.

 

 

2. while

 

while문은 일정 조건을 만족할 때 반복하는 경우에 주로 사용됩니다.

 

while문의 구조는 다음과 같습니다.

 

while(조건){

     명령;

}

 

for문과 마찬가지로, 조건을 정하여 이에 부합하면 명령을 실행하고 아니라면 while문은 빠져나옵니다.

 

#include <stdio.h>

int main()
{
    int i=0;
    
    while(i<10)
    {
    	printf("Hello World!\n");
        i++;
    }
}

 

 

3. do while

 

do while문은 while문에서 do가 추가된 구문으로 먼저 명령을 한번 수행하고나서 조건을 검사합니다.

 

do while문의 구조는 다음과 같습니다.

 

do{

     명령;

} while(조건);

 

#include <stdio.h>

int main()
{
    int i=0;
    
    do
    {
    	printf("Hello World!\n");
        i++;
    } while(i<10);
}

 

for, while문과 조건은 동일하지만 for, while문은 printf를 10번, do while문은 11번을 수행합니다.

 

 

4. break, continue

 

위에서 for문을 빠져나가기 위해 사용한 것이 break였습니다.

 

breakcontinue는 반복문을 빠져나가는 등의 흐름을 제어하기 위해 쓰이며, break는 특히 무한루프을 막기위해 사용됩니다.

 

4-1 break

 

break는 반복문에서 빠져나오게 합니다. 이 때 반복문이 2개 이상이라면, 가장 가까운 반복문으로부터 한 번만 빠져나옵니다.

 

#include <stdio.h>

int main()
{
    for(int i=1; i<10; i++)
    {
    	if(i == 5)
    	    break;
    	for(int j=1; j<10; j++){
    	    if(j == 3)
    	        break;
    	    printf("%d x %d = %d\n",i,j,i*j);
    	}
    }
    return 0;
}

 

1 x 1 = 1
1 x 2 = 2
2 x 1 = 2
2 x 2 = 4
3 x 1 = 3
3 x 2 = 6
4 x 1 = 4
4 x 2 = 8

내부 for문의 경우, j==3일 경우 break하게 되며 이 때는 내부 for문을 빠져나옵니다.

 

외부 for문의 경우, i==5일 경우 break하게 되며 이 때는 외부 for문을 빠져나옵니다.

 

 

4-2 continue

 

continuecontinue 뒤에 오는 코드를 실행시키지 않고 다음 반복문 차례로 넘어갑니다.

#include <stdio.h>

int main()
{
    for(int i=1; i<10; i++)
    {
        if(i % 2 != 0)
    	    continue;
    	for(int j=1; j<10; j++){
    	    if(j % 2 == 0)
    	        continue;
    	    printf("%d x %d = %d\n",i,j,i*j);
    	}
    }
    return 0;
}

 

2 x 1 = 2
2 x 3 = 6
2 x 5 = 10
2 x 7 = 14
2 x 9 = 18
4 x 1 = 4
4 x 3 = 12
4 x 5 = 20
4 x 7 = 28
4 x 9 = 36
6 x 1 = 6
6 x 3 = 18
6 x 5 = 30
6 x 7 = 42
6 x 9 = 54
8 x 1 = 8
8 x 3 = 24
8 x 5 = 40
8 x 7 = 56
8 x 9 = 72

 

내부 for문의 경우, j % 2 == 0 이라면 즉 j가 짝수라면 continue합니다. 이 때 뒤의 printf 코드는 실행하지 않으며 j++이 된채로 다시 for문을 반복합니다.

 

외부 for문의 경우, i % 2 != 0 이라면 즉 i가 홀수라면 continue합니다. 이 때 내부 for문은 실행하지 않으며 i++이 된채로 다시 for문을 반복합니다.

 

이렇게 반복문에서 예외처리하거나 무한루프에 빠지기 않기 위해 break, continue를 적재적소에 쓰는 것이 중요합니다.

 


이상으로 글을 마치겠습니다.

 

잘못된 부분이 있으면 알려주시면 감사하겠습니다!