반복 제어문과 기타 제어문

코딩하는 기린·2022년 3월 3일
0

C

목록 보기
6/13

반복 제어문

'반복 제어문'은 지정된 명령문을 조건이 참인 동안 반복하여 계속 수행하는 제어문입니다.

for문

'for문'은 반복 횟수가 정해져있는 경우에 사용합니다.

for(초기식; 조건식; 증감식){
	명령문;
}
  • '초기식'은 최초 for문 실행시 한번만 수행되며, 카운트하기위해 조건식에 사용될 변수의 값을 초기화합니다.
  • '조건식'은 매 루프마다 확인하면서 조건이 참이면 명령문을 수행하고, 거짓이면 for문을 종료하여 중괄호 밖으로 빠져나옵니다.
  • '증감식'은 초기식의 변수 값을 증가시키거나 감소시키는 용도로 사용합니다.
int i;
for(i=1; i<=5; i++){
    printf("i의 값 : %d\n", i);
}
i의 값 : 1
i의 값 : 2
i의 값 : 3
i의 값 : 4
i의 값 : 5

위의 예시를 보면 for문 최초 실행시 한번 수행되는 초기식에서 i의 값을 1로 초기화합니다.
그리고 조건식의 조건과 비교해서 i는 현재 1로, 5보다 작거나 같으므로 참이되어 for문의 명령문을 실행해서 printf()에 의해 'i의 값 : 1'이 출력됩니다.
그리고 증감값 계산식에 의해 i는 1 증가하므로 2가됩니다.
그리고 조건식의 조건과 비교해서 i는 현재 2로, 5보다 작거나 같으므로 참이되어 for문의 명령문

...

을 실행해서 printf()에 의해 'i의 값 : 5'가 출력됩니다.
그리고 증감값 계산식에 의해 i는 1 증가하므로 6이됩니다.
그리고 조건식의 조건과 비교해서 i는 현재 6으로, '5보다 작거나 같지않으므로' 거짓이되어 for문을 빠져나온 뒤 다음 명령문을 다시 순차적으로 수행합니다.

이렇게 반복 구조(loop)는 같은 명령문을 계속 수행합니다. 다만 영원히 반복할 수는 없기에 for문에서는 조건식과 증감식을 이용하여 종료조건을 주게되며, 조건을 충족시 종료되어 루프를 빠져나가는 것 입니다.

for문은 위처럼 기본 형태 외에도 다양한 형태로 사용이 가능합니다.

  • 초기식과 증감식 복수로 존재
    : i와 j를 함께 초기화하고 증감식에서 i와 j에 각각 증감 조건을 줍니다.
for(i=1, j=1; i<=10; i*=2, j+=3){...}
  • 조건식 생략
    : 종료 조건을 조건식에서 부여하지않고 증감 조건만을 준 뒤, for문의 명령문에서 if문 등을 사용하여 종료 조건을 부여합니다.
for(i=1; ; i+=5){ //(세미콜론은 절대 생략하면 안됩니다.)
	if(i<100) printf("아직 i의 값이 100보다 작습니다.\n");
    else break;
}
  • 증감식 생략
    : 증감 조건을 증감식에서 부여하지않고 명령문에서 부여합니다.
for(i=1; i<=1000;){
	...
    
    i <<= 2;
    
    ...
}
  • 초기식, 조건식, 증감식 모두 생략
    : 무한 루프로, 명령문에서 별다른 조건을 주어 빠져나가지않는 한, 무한 반복합니다.
for(;;){...}

for문은 if문과 마찬가지로 중첩하여 사용이 가능합니다.

for(int i=1; i<=11; i++){
    for(int j=1; j<=11-i; j++){
        printf(" ");
    }
    for(int k=1; k<=i*2-1; k++){
        printf("*");
    }
    printf("\n");
}
for(int i=10; i>=1; i--){
    for(int j=1; j<=11-i; j++){
        printf(" ");
    }
    for(int k=1; k<=i*2-1; k++){
        printf("*");
    }
    printf("\n");
}
          *
         ***
        *****
       *******
      *********
     ***********
    *************
   ***************
  *****************
 *******************
*********************
 *******************
  *****************
   ***************
    *************
     ***********
      *********
       *******
        *****
         ***
          *

while문

'while문'은 조건식이 참이면 계속 명령문을 반복해서 수행합니다. 조건식이 거짓이면 명령문을 수행하지않습니다.

while(조건식){
	명령문;
}

while문은 초기식과 증감식이 그 자체에 명시되어있지않으므로 while문 전에 외부나, 내부의 명령문 부분에서 따로 조건을 주어야합니다.
앞서 for문에서 식이 생략된 경우 for문의 명령문에서 따로 조건을 주었던 것과 비슷합니다.

int i=1;							//초기식
while(i<=5){						//조건식
	printf("i의 값 : %d\n", i);
    i++;							//증감식
}
i의 값 : 1
i의 값 : 2
i의 값 : 3
i의 값 : 4
i의 값 : 5

위의 예시처럼 초기식, 조건식, 증감식을 각각 사용해주면됩니다.
그리고 while문도 if문, for문처럼 중첩하여 사용이 가능합니다.

while문은 조건식이 참이면 루프가 구성됩니다. 그리고 참인 값은 0을 제외한 값이므로, 조건식에 0이 아닌값이 오게된다면 while문은 무한 루프가 구성됩니다. 따라서 의도적으로 무한 루프를 구성하였다면, 명령문에 break문, goto문 등을 사용하면 빠져나갈 수 있습니다.

do~while문

for문과 while문은 조건식을 먼저 검사한 뒤 참일때만 명령문을 실행하지만, 'do~while문'은 먼저 명령문을 실행한 뒤 조건문을 검사하여 계속 반복할지를 결정합니다. 즉, 적어도 한번은 명령문을 실행하게됩니다.

do{
	명령문;
}
while(조건식);		//반드시 세미콜론을 붙여야합니다.
do{
    printf("명령문 실행\n");
}
while(0);
명령문 실행

위의 예시처럼 명령문을 무조건 한번은 수행하기 때문에 명령문이 한번은 실행되었지만 그 뒤에 while문의 조건식이 거짓이므로 더이상 반복되지않습니다.

do{
    printf("명령문 실행\n");
}
while(1);
명령문 실행
명령문 실행
명령문 실행
명령문 실행
명령문 실행
명령문 실행
명령문 실행

...

하지만 위의 예시처럼 while문의 조건식이 참이라면 계속 반복하여 명령문을 실행하는데 위와 같은 경우, 따로 종료조건 없이 조건식이 1로 참이므로 무한 반복하게됩니다.

기타 제어문

앞서 살펴본 선택 제어문과 반복 제어문 외에도 프로그램을 제어할 수 있는 제어문이 존재합니다.

break문

'break문'은 루프 등에서 강제로 빠져나올 때 사용합니다.
단, 중첩된 루프 등에 속해있다면 모든 중첩에서 빠져나오는 것이 아닌, 현재 위치한 블럭에서만 빠져나옵니다.

for(int i=1; i<=5; i++){
    for(int j=1; j<=1000; j++){
        break;
        printf("j의 값 : %d\n", j);
    }
    printf("i의 값 : %d\n", i);
}
i의 값 : 1
i의 값 : 2
i의 값 : 3
i의 값 : 4
i의 값 : 5

위의 예시는 for문이 중첩되어있고, i로 초기화된 루프의 명령문은 정상 실행되지만, j로 초기화된 루프의 명령문은 명령문 시작부에 break문으로 해당 블럭을 빠져나가게 되므로 break문 뒤의 명령문은 실행되지않습니다.

continue문

'continue문'은 루프 실행 중 주로 if문과 함께 사용하여 특정 조건을 만족시 해당 루프의 처음으로 돌아가 다시 반복합니다.

for(int i=1; i<=10; i++){
    if(i%2==0){
        continue;
    }
    printf("%d\n", i);
}
1
3
5
7
9

위의 예시는 for문을 수행하는데 명령문 처음에 if문의 조건에서 i를 2로 나눈 나머지가 0이면, 즉 짝수이면 continue문이 실행되어 continue문의 다음 부분은 실행되지않고 루프의 처음으로 돌아가 처음부터 다시 수행합니다. 따라서 짝수는 출력되지않고 if문의 조건에서 거짓이되는 홀수만 출력합니다.

profile
Coding Giraffe.

0개의 댓글