본문으로 바로가기

[C] 반복문(while, do-while, for)

category 개발자과정준비/C 2020. 10. 8. 17:45
반응형

반복문

일반적으로 프로그래밍 언어에서는 반복적으로 여러 번 수행되어야 할 명령문으 간단히 표현할 수 있도록 반복문을 갖추고 있다. C 언어에서 반복문은 while문, for문, do-while문이 있다. 반복문의 주요 구성부분은 반복횟수를 결정하는 제어부분과 반복해서 실행되어야할 명령문이다.

 

while문

while문은 특정 조건을 주고 그 조건이 만족될 때까지 명령문이 반복해서 실행된다.

 

while은 키워드이고, 반복 조건은 괄호 속에 묶여져 있다. while문의 실행이 시작되면 먼저 반복 조건의 논리값이 참인지 거짓인지 계산된다. 논리값이 참이면 명령문이 수행되고, 거짓이면 while문을 벗어나 다음 명령문이 실행된다.

매번 명령문이 실행된 다음에는 노리값이 다시 검토되어 while문의 반복 실행여부가 결정된다.

 

 

 

// 1에서 10사이의 짝수 합 출력하기
#include<stdio.h>
int main(void) 
{
	int num = 1;
	int sum = 0;

	while (num <= 10) 
	{
		if (!(num % 2))
		{
			sum += num;
			printf("입력된 짝수 : %d\n", num);
		}
		num++;
	}
	printf("1부터 10사이 짝수의 합 : %d\n", sum);
}

 

#include<stdio.h>
#pragma warning(disable: 4996)

int main(void) 
{
	int val = 1;
	int idx = 1;
	printf("출력하고자 하는 구구단은 몇 단? : ");
	scanf("%d", &val);

	while (idx != 10) 
	{
		printf("%d * %d = %d \n", val, idx, val * idx);
		idx++;
	}
	return 0;
}

 

 

 

do-while문

while문에서 반복 조건이 먼저 검토된 다음 명령문을 실행하는 것에 비해 do-while문에서는 명령문을 먼저 실행한 다음 반벽 여부를 결정하는 점이 다르다. 즉, 조건이 맞든 안맞든 무조건 1번은 돌린다.

 

do-while문의 실행순서는 먼저 명령문이 한번 실행된 다음 조건을 나타내는 논리식의 값이 계산된다. 논리식의 값이 참이면 명령문이 반복 실행되고, 거짓이면 do-while문의 실행이 끝난다.

 

 

// 입력받은 정수의 총합 구하기(단, 입력수가 0이면 프로그램 종료)
#include<stdio.h>
#pragma warning(disable: 4996)

int main(void) 
{
	int num = 0;
	int sum = 0;
	do
	{
		printf("Input Number : ");
		scanf("%d", &num);
		sum += num;
	} while (num != 0);
	printf("Total sum : %d \n", sum);

	return 0;
}

 

 

for문

for문은 보통 반복횟수가 사전에 정해진 경우에 많이 사용되는 반복문이나 실제 사용하는 방법에 따라서 많은 변형을 가지고 있다.

초기식, 조건식, 증감식은 괄호로 묶어주고 그 사이에 세미콜론( ; )을 찍는다. 초기식에는 제어변수의 초기값을 설정한다. 조건식은 논리식으로 반복을 계속할지, 중단할지 여부를 결정한다. 증감식에는 제어변수의 값을 증가 또는 감소시킨다. 반복문의 증감식에는 주로 증감연산자를 사용하여 간단히 표현한다.

for문은 while문의 초기식, 조건식, 증감식을 한곳에 모아 놓은 것이다.

 

 

for문이 실행되는 순서는 아래와 같다.

 

 

 

 

 

 

 

for문이나 while의 모양은 거의 똑같다고 볼 수 있다

 

 

 

while문과 for문에대해 좀 더 자세히 알아보자.

#include <stdio.h>
int main(void){
	int sum = 0;
	int count = 0;
	while (count < 5)
	{
		sum = sum + count;
		++count;
	}
	printf("%d\n", sum);

	//////////////////////////////////////////////////////////

	for (sum = 0, count = 0; count < 5; ++count)
	{
		sum = sum + count;
	}
	printf("%d\n", sum);
    
    return 0;
 }

코드를 작성하고 디버그모드에서 디스어셈블리로 확인해보자.

while문과 for문의 어셈블리어

각 코드들이 어떤 의미인지는 다음에 알아보도록하고 한줄한줄마다 명령기능이 있다. while문에는 14줄, for문에는 17줄인 것을 확인할 수 있다. 따라서, 똑같은 반복문을 작성할때는 while문이 좀 더 효율적이라고 볼 수 있다.

 

while문과 for문의 예제는 결과는 같지만, 일하는 정도는 다르다고 볼 수 있다.

예를들어, 똑같은 100만원의 세탁기 A, B가 있는데, A 세탁기는 전기세가 10000원이고, B 세탁기는 전기세가 15000원인 셈이다.

지금은 3줄(세탁기는 5천원)차이 밖에 나지않지만, 헤비한 코드가 됬을때는 그 차이가 너 심하게 날 것이다. C언어는 최적화를 잘해야 하므로 어떤 기능을 구현할때 사용할 구문에 대해서 알아가는 것이 좋을 것이다.

(자바나 C#은 기능을 빠르게 구현하는게 중요하기때문에 이런 최적화과정은 필요없다)

 

 

 

무한 반복문에 대해서도 알아보자.

while문과 for문의 무한반복문
무한반복문일때 디스어셈블리어 코드


for문이 더 짧으니까 바이트수가 적으므로 좀 더 효율적이다.

while
009A1838  mov         eax,1  
009A183D  test        eax,eax  
009A183F  je          main+40h (09A1850h)  
009A1841  push        offset string "test" (09A7B34h)  
009A1846  call        _main (09A1046h)  
009A184B  add         esp,4  
009A184E  jmp         main+28h (09A1838h)

for
009A1850  push        offset string "test" (09A7B34h)  
009A1855  call        _main (09A1046h)  
009A185A  add         esp,4  
009A185D  jmp         main+40h (09A1850h)  

 

 

 

 

 

 

! 논리연산자에 대해

// 1에서 10사이의 짝수 합 출력하기
#include<stdio.h>
int main(void) 
{
	int num = 1;
	int sum = 0;

	while (num <= 10) 
	{
		if (!(num % 2))
		{
			sum += num;
			printf("입력된 짝수 : %d\n", num);
		}
		num++;
	}
	printf("1부터 10사이 짝수의 합 : %d\n", sum);
}

맨 첫번째 예제에서 if( !(num % 2) ) 를 살펴보자.

지난 포스팅에서 C의 if문은 0을 기준으로 0이냐 0이 아니냐에따른 조건을 따른다고 했다.

즉, 0을 제외한 어떤 숫자가 오든 참이되고, 0이 되면 거짓이 되는 것이다.

 

1에서 10사이 짝수 합을 구하는 예제에서 if( !(num % 2))를 살펴보자.

우선 처음 실행될때는 num1 = 1 이다.

if( !(1 % 2)) 이 되는데, 1 % 2의 결과는 1이다.

if( !(1)) 이 된다.

!(1)은 1이 있다는 것을 부정하는 것이므로 없다 => 0 이 된다.

따라서, num = 1일때는 나머지가 1이 있으므로 if문 자체가 거짓이 되기때문에 sum += num;을 실행하지 않는다.

=> 홀수이므로 짝수합에 더하지 말고 num의 숫자만 1 증가시켜준다.

 

C는 bool형이 없기때문에 True/Flase가 존재하지 않는다.

if( 조건문 )   자바나 C#에서 조건문은 bool형으로 들어가면 되는데 C에서는 있다 없다(0, 1)로 조건문을 작성하기 때문에 혼동할수도 있다. 

만약 조건문이 !(0)이 되면 '0이 아니다' => '1'  이 된다.

여기서 0, 1은 숫자가 아니고 참/거짓(있다/없다)라고 보는 것이 옳다.

!(1)  !(-1)  !(1000)  !(124235346245)   이 조건들의 결과는 0이 된다.

 

 

반응형