본문 바로가기
C C++/C언어 기초

C언어 while 반복문의 모든 것 (feat. while문 예시, do~while문)

by Go! Jake 2022. 3. 20.

반복문은 조건을 만족하는 동안 특정영역을 반복하는 구조입니다. 반복문은 광범위하게 사용이 되며 대표적으로 while문과 for문이 있습니다. while문에 대해 알아보겠습니다.

 

반복을 명령하는 while문 기본 알기

기본 while문

조건을 만족할 때까지 반복하는 while문의 예시로 아래 Hello World를 3번 출력하는 문장을 살펴 볼 수 있습니다.

#include <stdio.h>

int main(void)
{
	int num = 0;
	while (num < 3)
	{
		printf("Hello World!\n");
		num++;
	}
	return 0;
}

- while ()에서 소괄호 내 반복 조건을 명시합니다. '참'인 경우 아래 명령을 실행합니다.

- while () 아래 구문에는 {} 중괄호를 통해 실행할 구문을 입력합니다.

- 초기 num = 0 으로 정의되었기 때문에 Hello World!를 출력하고, 이는 num = 3이 될 때 멈춥니다.

조건이 만족하지 않으면, 아래 명령 구문은 건너뜁니다.

 

조건을 바꾸어 while (1)이라고 하면 다음과 같습니다.

#include <stdio.h>

int main(void)
{
	int num = 0;
	while (1)
	{
		printf("Hello World!\n");
		num++;
	}
	return 0;
}

참고로, while(1)은 괄호 안에 조건이 만족하냐 하지 않는지 봤을 때 항상 1(True)이므로 항상 만족한다는 의미입니다. 따라서 아래 루프는 무한으로 돌게 됩니다. 이를 '무한 루프'라고 합니다. 무한 루프를 그만 멈추고 싶다면 Ctrl+C를 통해 실행을 멈출 수 있습니다.

 

참고로, 반복의 대상이 한 문장이라면 중괄호를 생략할 수 있습니다.

	while (num<3)
		printf("Hello World!\n",num++);

 

while문 중첩

while문 안에 while문이 있는 것을 while문의 중첩이라고 합니다. 반복되어야 하는 변수가 2가지인 경우 while문이 2개 필요할 수 있습니다. 구구단을 계산하는 구문을 아래와 같이 작성할 수 있습니다.

#include <stdio.h>

int main(void)
{
	int num1 = 2;
	int num2 = 2;
	while (num1 < 10)
	{
		num2 = 2;
		while (num2 < 10)
		{
			printf("%dx%d=%d \n", num1, num2, num1 * num2);
			num2++;
		}
		num1++;
	}
	return 0;
}

- num1과 num2를 int로 정의 해 주었다.

- while (num1 < 10)을 통해 첫 번째 피연산자가 2~9까지 돌 수 있는 조건을 만들었다.

- while (num1 < 10) 조건 아래 명령문에 num2 = 2를 통해 두번 째 피 연산자가 매번 연산 시작시에 2로 리셋되도록 설정하였다.

- 두 번째 while문인 while (num2 < 10)을 작성하고 계산식을 넣었다.

- 각 while문마다 피연산자가 +1씩 올라가도록 적었다.

 

do ~ while문에 의한 문장의 반복

do ~ while문은 while문의 일종으로 '반복의 조건을 보는 시점'만 다릅니다. 우선 실행 후 뒷 부분에서 '반복 조건'을 검사합니다.

#include <stdio.h>

int main(void)
{
	int num = 0;
	do
	{
		printf("Hello World!\n");
		num++;
	}while(num < 3);
	return 0;
}

do를 통해 먼저 명령문을 실행한 후 뒷 부분에 while(num < 3); 조건을 붙였습니다. 조건식이 '참'인 경우 명령문을 반복합니다. 

 

그럼 어떤 목적으로 사용되는 것일까요? 이는 '반복영역이 반드시 한 번 이상 실행되어야 할 때 ' do ~ while문이 필요합니다. 예를 들어 '입력이 0인 경우 종료'라는 구문을 사용한다고 해 보면 아래와 같습니다.

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


int main(void)
{
	int num = 0;
	do
	{
		scanf("%d", &num);
		printf("입력이 0이 아닙니다. 재수행합니다.\n");
	}while(num != 0);
	return 0;
}

break를 통해 반복문 빠져 나오기

반복문을 탈출할 때 break 키워드를 사용하여 빠져 나올 수 있다. break를 통해 break문이 포함된 가장 작은 반복문을 멈출 수 있다. 1부터 100까지 더한 값을 계산할 때  모든 합을 구하는 예시이다.

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


int main(void)
{
	int num=1;
	int sum=0;
	
	while (1) // while 1로 항상 참으로 진입
	{
		sum += num;
		num++;
		if (num > 100) // if문을 통해 100 초과일 때 조건
		{
			break; // break를 통해 while문을 빠져 나올 수 있음
		}
	}
	printf("%d", sum);
	return 0;
}

- while (1)을 통해 항상 참으로 진입할 수 있도록 하였습니다. 이 때는 while문 진입 후 멈추는 조건으로 break를 사용하는 것이 됩니다.

- if ~ break 조건을 통해 num 값이 100을 초과할 때 멈추는 것으로 조건을 두었습니다. if문을 멈추는 게 아닌 가장 가까운 반복문을 멈춥니다.

continue를 통해 반복문 빠져 나오기

continue는 반복문 안에 포함되어 반복문의 조건검사 위치로 바로 이동합니다. continue문의 이후는 생략하고, 다시 실행하게 됩니다.

 

while문에서 continue를 통해 '일부를 필터링'하는 것을 구현 해 보겠습니다. 예시로는 1에서 100미만의 값 중 홀수만 출력하는 것입니다.

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


int main(void)
{
	int num = 0;
	while (num<100)
	{
		num++;
		if (num % 2 == 0)
		{
			continue;
		}
		printf("%d\n", num);
	}
	return 0;
}

- while문을 통해 num 값이 100미만일 때로 한정하였습니다.

- if문을 통해 나머지가 0이면 짝수로 판단하고 continue를 통해 printf를 하지 않았습니다. (필터링)

- 홀수인 if문을 만족하지 않으므로 아래 printf문을 통해 값이 출력됩니다.

댓글