C언어(학점아님)/c언어 개념

4. 선택문(if, switch ~ case)

오버헤드프레스 2023. 3. 19. 00:57

제어문은 크게 선택문, 반복문, 분기문으로 나누어진다.

선택문 : if, switch ~ case

반복문 : while, for, do ~ while

분기문 : break, continue, goto, return

 

이번엔 선택문을 다룰 것이다.

 

if문의 기본 형식

if문도 여러 가지가 있는데 가장 기본인 if문을 살펴보자.

예를 들어 a값이 10보다 클 때만(조건) b에 a를 대입하고 싶다면 다음과 같이 작성한다.

if (a > 10)   //조건식
{
    b = a;    //실행문
}

조건식을 만족할 때 실행할 실행문은 중괄호로 묶어준다.

예제를 통해 구체적인 실행 과정을 알아보자.

 

#include <stdio.h>

int main()
{
	int a = 20;
	int b = 0;
	
	if(a > 10)    //조건식 : a가 10보다 크므로 조건식은 참 
	{
		b = a;    //실행문 : b = a 대입문 실행 
	}
	
	printf("a : %d, b : %d\n", a, b);  //대입이 수행되면 두 값은 같음  
	
	return 0;
}

int a = 20;에서 a가 20으로 초기화되므로  a > 10이 참이 되어 b = a;라는 실행문이 수행된다.

따라서 b는 a의 값을 가지게 된다. a > 10이 거짓이라면 b = 0을 유지한다.

 

if문은 규칙이 있다.

1. if문은 중괄호 { }를 사용하고 들여쓰기하여 실행문을 명확히 구분하는 것이 좋다. (중괄호를 생략할 수도 있다.)

2. 실행할 문장이 두 문장 이상이면 반드시 중괄호로 묶어야 한다.

 

 

if ~ else문

조건을 만족하지 못할 때에도 별도의 실행문이 있으려면 어떻게 해야 할까?

ex) a가 0보다 크거나 같으면 a에 1을 대입하고 0보다 작으면 -1을 대입하는 경우

if(a >= 0)     //조건식
{
    a = 1;     //실행문 1
}
else
{
    a = -1;    //실행문 2
}

a >= 0일 경우 a = 1이 된다. 그러나 a >= 0이 아닐 경우엔 a = -1이 된다.

 

예제를 통해 살펴보자.

 

#include<stdio.h>

int main()
{
	int a = 10;
	
	if(a >= 0)
	{
		a = 1;    //a가 0보다 크거나 같으면 a에 1 대입
	}
	else
	{
		a = -1;   //a가 0보다 작으면 a에 -1 대입
	}
	
	printf("a : %d\n", a);
	
	return 0;
}

a의 초깃값이 10이므로 a >= 0은 참이 되어 if문을 수행하고 else문을 건너뛰기에 a = 1이 출력된다.

 

if ~ else 문의 규칙

1. if ~ else문의 else에는 조건을 사용하지 않는다.

2. 실행할 문장이 두 문장 이상이면 반드시 중괄호로 묶어야 한다.

3. 경우에 따라 if문을 두 번 사용하는 것보다 if ~ else문을 한 번 사용하는 것이 좋다.

 

 

if ~ else if ~ else문

나는 이 선택문이 너무 중요하다 생각하기에 색깔을 달리했다.

 

3개 이상의 실행문에서 반드시 하나를 선택하는 경우 if ~ else if ~ else문을 사용한다.

바로 예제를 통해 알아보자.

 

#include<stdio.h>

int main()
{
	int a = 0, b = 0;
	
	if(a > 0)        //조건식 1 : a가 0보다 크면 b에 1 대입 
	{
		b = 1; 
	}
	else if(a == 0)  //조건식 2 : a 가 0보다 크지 않고 a가 0이면 b에 2 대입 
	{
		b = 2;
	}
	else             //a가 0보다 크지 않고 0도 아니면 b에 3 대입 
	{
		b = 3;
	}
	
	printf("b : %d\n", b);  //if문으로 결정된 b값 출력 
	
	return 0;
}

조건이 여러 개인 경우 첫 번째 조건부터 검사한다. a = 0이기에 if를 건너뛴다.

두 번째 조건은 a == 0일 때 b = 2인데 참이기에 b = 2를 출력한다.

 

만약 조건이 추가되면 마지막 else에 if ~ else문을 이어서 작성한다.

 

if ( )
{
}

else if( )
{
}

else if( )
{
}

else
{
}

else if는 이렇게 추가하면 된다.

 

if ~ else if ~ else 문의 규칙

1. 각 조건에 따라 실행할 문장이 두 문장 이상이면 반드시 중괄호로 묶어야 한다.

2. 조건식을 차례로 검사하므로 이전 조건의 결과가 반영된다.

 

 

 

if문 활용과 switch ~ case 문

문제를 해결하다 보면 여러 조건 중에 선행조건이 있는 경우가 있다,

다음과 같이 A대학교 학생이라는 선행조건이 꼭 필요할 때 if문을 중첩해서 사용한다.

또한 학점에 따라 장학금의 지급액이 다를 때도 있을 텐데 이때는 if문보다 switch ~ case문이 더 편리하다.

 

if문 중첩

어떤 조건을 검사하기 전에 선행조건이 있다면 if문 안에 if문을 넣어 사용한다.

예제를 통해 알아보자.

 

#include<stdio.h>

int main()
{
	int a = 20, b = 10;
	
	if(a > 10)     //a가 10보다 크면 9~16행 실행, 작거나 같으면 18행으로 이동
	{
		if(b >= 0)  //b가 0 이상이면 b에 1 대입하고 18행으로 이동
		{
			b = 1;
		}
		else        //b가 0보다 작으면 b에 -1 대입하고 18행 이동
		{
			b = -1;
		}
	 } 
	
	printf("a : %d, b : %d\n", a, b);
	
	return 0;
}

a = 20이므로 a > 10은 참이 되어 if(b >= 0)을 실행한다. 또한 b >= 0이기에 결괏값은 a = 20, b = 1이다.

만약 a가 9였다면 바로 printf로 이동하여 10, 10이라는 결괏값을 출력했을 것이다.  

 

if문을 중첩해서 쓰는 이유

1. 선행조건이 있으면 불필요한 조건 검사를 하지 않는다.

2. 선행조건 없어도 실행 효율을 위해 의도적으로 중첩해 사용할 수 있다.

 

 

 

switch ~ case문

switch ~ case문의 형식을 알아보고 예제로 바로 넘어가자.

switch(조건식)
{
case 상수식1:
    실행문1;
    break;

case 상수식2:
     실행문2;
     break;

case 상수식3:
     실행문3;
     break;
}

형식은 이렇다. 또한 규칙이 있는데 간단하게 보자면

1. 조건식은 정수식만 사용한다.

2. 기본적으로 case는 break를 포함한다.

 

등수에 따라 상금을 차등 지급하는 예제를 적어보자.

 

#include<stdio.h>

int main()
{
	int rank = 2, m = 0;
	
	switch(rank)        //rank의 값이 얼마인지 확인 
	{
		case 1:         //rank가 1이면 
			m = 300;    //m = 300을 수행하고 
			break;      //블록을 벗어나 25행으로 이동 
	    
	    case 2:         //rank가 2이면 
	    	m = 200;    //m = 200을 수행하고 
	    	break;      //블록을 벗어나 25행으로 이동 
	    
	    case 3:         //rank가 3이면 
	    	m = 100;    //m = 100을 수행하고 
	    	break;      //블록을 벗어나 25행으로 이동 
	    
	    default:        //rank가 일치하는 case의 값이 없으면 
	    	m = 10;     //m = 10을 수행하고  
	    	break;      //블록을 벗어나 22행으로 이동 
	}
	
	printf("m : %d\n", m);
	
	return 0;
}

int rank = 2;를 통해 case 2로 이동한다. break 이전까지 실행한 후, break를 통해 printf로 블록 탈출을 한다.

그러나 1, 2, 3등을 못하고 5등을 했다면 default값으로 이동해 m 은 10이 출력됐을 것이다.

 

break 생략

break는 필요에 따라 생략할 수 있다. 필요에 따라 전부나 일부를 생략할 수 있다.

switch(rank)
{
    case 1:
       m += 300;
    case 2:         //rank의 값이 2, case 2로 이동
       m += 200; 
    case 3:         //m에 200을 더하고 m에 100도 더한다
       m += 100;
}

이 경우 rank는 2였지만 case 2 아래로 전부 실행되므로 200과 100을 더한 300이 나오게 된다.

break를 생략한 경우 잘못 작성한 코드로 오해할 수 있으니 유의해서 사용하자.

 

이번 글에서는 선택문에 대해서 알아봤으며 다음 글에서는 반복문에 대해서 다룰 예정이다.

'C언어(학점아님) > c언어 개념' 카테고리의 다른 글

6-1. 함수  (0) 2023.03.19
5. 반복문  (0) 2023.03.19
3-2. 그 외의 연산자  (0) 2023.03.18
3-1. 연산자  (0) 2023.03.18
2. 변수와 데이터 입력  (0) 2023.03.14