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

[C 언어] 7. 제어문

by 천무지 2024. 4. 14.
반응형

제어문

1. 조건문

조건문이란 어떤 조건이 주어졌을때 그 조건이 성립한다면 동작을 수행하도록 해주는 문장을 말합니다.

주어진 조건에 따라 프로그램이 동작하거나 동작하지 않도록 할 수 있습니다.

조건을 판단할 때는 boolean으로 참 혹은 거짓으로 판단합니다.

비유를 하자면 갈림길에서 어떠한 길로 갈지 선택한다고 생각할 수 있습니다.

조건문에는 if문과 switch문이 있는데 하나씩 살펴보겠습니다.

 

2. 반복문

반복문에는 while문, for문, break문, continue문이 있습니다.

조건이 참인 동안에 반복을 수행합니다.

만약 반복을 수행하다가 조건이 거짓이 된다면 반복문을 빠져나옵니다.


If문

If문은 조건이 참이면 명령문을 실행합니다. 이때 조건을 condition이라고 하고 명령문들을 statement라고 합니다.

조건인 condition 부분에는 논리연산자나 관계연산자가 주로 쓰입니다.

조건이 거짓이면 if_else문이나 else문이 실행될 수 있습니다.

 

몇 가지 예시를 보면서 좀 더 알아보겠습니다.

#include <stdio.h>
void main() {
	int m=40,n=20;
	if (m == n) {
		printf("m and n are equal\n");
	}
	else {
		printf("m and n are not equal\n");
	}
}

이 코드는 if문 안의 조건문인 m==n이 참이면 if문이 실행되고 m==n이 거짓이라면 else문을 실행하는 코드입니다.

코드에서 m = 40, n = 20으로 초기화 되어있기 때문에 두 값은 같지 않습니다. 따라서  else 문을 실행하게 됩니다.

결과를 보면 else문이 실행된 것을 확인할 수 있습니다.

 

다른 예시를 보겠습니다.

#include <stdio.h>
void main() {
	int a, b;
	printf("Please enter two integers: ");
	scanf("%d %d", &a, &b);
	if (a <= b)
		if (a < b)
			printf("%d < %d", a, b);
		else
			printf("%d == %d", a, b);
	else
		printf("%d > %d", a,b);
}

이번에는 if문과 if_else문, else문 3가지가 모두 쓰였습니다. 먼저 a, b 두 값을 입력받고 두 수의 크기를 비교하는 코드입니다.

제일 바깥에 위치한 if문에서 두 수가 같거나 b가 a보다 더 크다면 statement가 실행됩니다.

이후 내부 if 문에서 a < b 조건을 만족한다면 바로 아래 명령어가 출력되고 해당 조건이 거짓이라면 내부에 위치한 if문 아래에 있는 else 문을 실행합니다.

만약 에초에 제일 바깥에 있는 if문의 조건이 틀렸다면 제일 아래의 else문을 실행하게 됩니다.

 

Switch문

스위치문은 표현된 값에 따라 임의의 명령을 실행할 수 있습니다.

여기서 표현된 값은 정수형이어야 합니다.

기본 문법은 다음과 같습니다.

switch (expression) {
	case label1: statements;
			break;
	case label2: statements;
			break;
	case label3: statements;
			break;
	default: statements;
			break;
}

expression에 해당하는 label이 없다면 default문장이 실행됩니다. 

기본 문법을 자세히 살펴보면 각각의 case마다 break가 있는 것을 볼 수 있습니다.

여기서 break는 switch_case문을 전체 빠져나온다는 의미로 사용되었습니다.

만약 break문을 써주지 않는다면 expression에 해당하는 case를 실행하고 실행한 case문 아래에 있는 모든 문장들을 실행합니다.

따라서 switch_case문을 통해 프로그램이 자신이 원하는 동작을 하도록 하려면 break를 사용하는 것에 주의해야합니다.

 

예시를 하나 살펴보겠습니다.

#include <stdio.h>
void main () {
int value = 3;
switch(value)   {
	case 1:
		printf("Value is 1 \n" );
		break;
	case 2:
		printf("Value is 2 \n" );
		break;
	case 3:
		printf("Value is 3 \n" );
		break;
	case 4:
		printf("Value is 4 \n" );
		break;
	default :
		printf("Value is other than 1,2,3,4 \n" );
	}
}

표현값이 value라는 변수로 되어있고 이 값은 정수형 3으로 초기화 되어있기 때문에 스위치문에서 case 3에 해당하고 해당 statement를 실행합니다.

printf를 수행한 후 break를 만났으니, 스위치문 전체를 빠져나오게 됩니다.

만약 break를 써주지 않았다면 case 4와 default 까지 실행되었을 겁니다. 


For문

for문은 초기문, 조건문, 증감문을 구성되어있습니다. [ex) for(초기문; 조건문; 증가문)]

각각의 구문들은 세미콜론으로 구분합니다. for문의 ()안에는 세 구문은 비워놓더라고 세미콜론은 반드시 써주어야 합니다.

for문은 제일 먼저 초기문을 실행합니다.

그 다음 조건이 맞는지 검사를 하고 참이면 statement를 실행합니다.

수행을 마친 후 증감문을 실행하고 다시 조건문을 실행해 변화한 값에 대하여 참, 거짓을 판단합니다.

참이면 이전과 똑같이 반복을 실행하고, 거짓이라면 for문을 종료합니다.

#include <stdio.h>
void main() {
    int i;
    for (i = 0 ; i<7 ; i++)  {
	printf("Hello C!\n");
    }
}

다음 코드는 Hello를 7번 출력합니다. i가 0,1,2,3,4,5,6일 때에 대해서 출력합니다. i 가 7이 되는 순간은 조건에 부합하지 않기 때문에 for문을 빠져나오고 프로그램은 종료됩니다.

 

for문은 for문에 for문을 실행시킬 수 있습니다. 반복을 반복하는 것입니다. 

 

예시 코드를 보면서 알아보겠습니다.

#include <stdio.h>
void main() {
    int i, j;
    for (i = 2; i <= 4; i++)
	for (j = 1 ; j < 10 ; j++ )
            printf("%d * %d = %d\n",i , j, i*j);
}

for문은 조건이 참이면 statement를 실행한다고 했는데 여기서 내부의 for문이 외부의 for문의 statement인 샘입니다.

따라서 i가 2일때 내부의 반복문이 j가 1부터 9까지 실행됩니다.

내부의 반복이 끝나면 i는 증감문으로 인해  3이 되고 다시 내부의 반복문이 j가 1부터 9까지 실행합니다.

i가 4일 때도 마찬가지의 반복을 합니다.

그리고 프로그램이 종료됩니다.

 

Break문

break문은 반복을 종료하고, break문을 품고 있는 가장 가까운 반복문 하나를 빠져 나옵니다.

Continue문

continue문은 자신보다 아래에 있는 문장들은 건너뛰어 실행하지 않고 다음 반복을 계속합니다.

 

예시를 살펴보겠습니다.

#include <stdio.h>
void main() {
	int i, sum = 0;
	for (i = 0; ; i++) {
		if (i >= 100)
			break;
		else if (i % 4 == 0)
			continue;
		sum += i;
	}
	printf("sum=%d\n", sum);
}

다음 코드는 1부터 99사이의 4의 배수가 아닌 숫자들의 합을 구하는 코드입니다.

for문에 조건문이 없습니다. 따라서 항상 참이고 무한루프를 돌게 됩니다.

하지만 i가 증감문을 통해서 증가되고 있으며, 내부의 if문에서 i가 100보다 커지면 break문을 만나 반복을 끝내게 됩니다.

i가 4의 배수인 경우 i % 4는 결과가 0이기때문에 else if문의 조건이 참이 되고 continue문을 통해 자신보다 아래의 반복을 수행하지 않고 다음 반복을 실행합니다.

i가 100보다 커지면 반복문을 빠져나오고 printf함수를 실행하고 프로그램이 종료됩니다.

 

While문과 do while문

while문은 조건이 참일 때만 반복을 수행하는데에 반해 do while문은 조건이 참이든 거짓이든 무조건 1회는 수행을 합니다. 이후에 조건문이 참인지 거짓인지 판단하고 다음 반복을 할 지 말 지 결졍합니다

 

while문 예시를 보겠습니다.

#include <stdio.h>

void main() {
	int i = 0;
	while (i < 5)
	{
		printf("HI\n");
		i++;
	}
}

i가 5보다 작을 때에만 반복을 하며 1회 반복마다 i가 1씩 커지고 있습니다.

따라서 i가 0,1,2,3,4일때만 반복을 수행하고 이후에는 조건이 거짓이 되기 때문에 반복문을 빠져나옵니다.

 

이번에는 do while문 예시를 보겠습니다.

#include <stdio.h>
void main() {
	int i=1;
	do {
		printf("%d ",i);
		i++;
	} while(i<4 && i>=2);
}

while의 ()안에 있는 조건을 살펴보면 i는 처음에 1이기 때문에 조건에 부합하지 않지만 do while문은 조건의 참, 거짓에 관계없이 1회는 무조건 수행하므로 반복문 내부의 printf 함수가 실행됩니다. 그리고 i는 2가 되고 조건이 참인지 판단합니다. 조건이 참이므로 반복문이 수행됩니다.

 

반응형