조건문(if, switch-case)

이지우·2022년 4월 15일
1

C언어

목록 보기
1/17

제어문

프로그램을 조건에 따라 실행하거나 실행하지 않아야 할 때 사용한다.

  • 선택문 : if, switch ~ case
  • 반복문 : while, for, do ~ while
  • 분기문 : break, continue, goto, return

if문

기본 형식

조건식을 만족하면 실행문이 실행되고, 만족하지 않으면 실행하지 않고 지나간다.

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

-> a 값이 10보다 클 때만 b에 a를 대입한다.

코드 읽기 쉽게 작성하는 법

  • 중괄호 사용
    if문의 실행문을 중괄호를 사용하여 묶어 작성하는 것이 좋지만 실행문이 한 문장일 경우에는 중괄호를 삭제할 수 있다.
    하지만 실수를 줄이기 위해서 항상 중괄호를 쓰는 것을 권장한다.
  • 들여쓰기
    들여쓰기하여 조건식과 실행문을 구분하기 쉽게 작성해야 한다.

예시 1)

if (a > 10){
   b = a;
}

예시 2)

if (a > 10)
   b = a;

예시 3)

if (a > 10) b = a;

if ~ else 문

조건을 만족하지 못하였을 경우에도 실행문을 작성할 때 사용한다. (조건을 만족하는 경우와 만족하지 않을 경우를 작성할 수 있음)

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

-> a가 0보다 크거나 같으면 a에 1을 대입하고 0보다 작으면 -1을 대입한다.
a가 10일 때 : 실행문1이 실행되고 실행문2는 건너뛴다. -> a = 1
a가 -5일 때 : 실행문1은 건너뛰고 실행문2가 실행된다. -> a = -1

else에는 조건을 사용하지 않는다.

조건을 만족하지 않는 경우 무조건 else문이 실행되므로 조건을 따로 작성할 필요가 없다.

실행문이 두 문장 이상이면 중괄호로 묶어야 한다.

하지만 위의 기본 if문과 같이 실행문이 한 문장인 경우에는 중괄호를 생략 가능하다.

if (a >= 0)
{										// 실행문이 두 문장 이상이기 때문에 중괄호 사용
	printf("현재 a의 값 : %d\n", a);		// 현재 a 값 출력 후
    a = 1;								// a를 1로 바꿈
}
else
	a = -1;								// 실행문이 한 문장이기 때문에 중괄호 생략 가능

if문을 두 번 사용하는 것보다 if ~ else문으로 바꾸어 사용하는 것이 좋다.

if문 두 번 사용

if (a >= 0){
   a = 1;
}
if (a < 0){
   a = -1;
}

if ~ else문 사용

if (a >= 0){
   a = 1;
}
else{
   a = -1;
}

if문을 사용해도 같은 결과가 나오지만 만약 두 번째 if문의 조건식을 잘못 작성하면 둘 다 실행되거나 하나도 실행되지 않을 수 있다.
또한 조건식을 두 번 검사하므로 else문을 사용하는 것보다 실행 속도가 느려질 수 있다.
따라서 2개의 실행문 중 하나를 선택하는 경우에는 if ~ else문을 사용하는 것이 좋다.

if ~ else if ~ else 문

3개 이상의 실행문 중 하나를 선택하는 경우에 사용한다.
ex) a 값에 따라 b 값을 1, 2, 3 중에 하나로 결정할 때

  • a가 0보다 크면 b는 1
  • a가 0이면 b는 2
  • a가 0보다 작으면 b는 3
if (a > 0){			// 조건식1
	b = 1;			// 실행문1
}
else if (a == 0){	// 조건식2
	b = 2;			// 실행문2
}
else{
	b = 3;			// 실행문3
}

조건을 추가하려면 else에 if ~ else문을 이어서 작성한다.

조건을 차례로 검사하기 때문에 이전 조건의 결과가 반영된다.

if ~ else if ~ else문을 사용할 때는 조건식을 검사하는 순서에 주의해야 한다.

if (a >= 10){
	b = 1;
}
else if (a >= 0){	// else if ((a < 10) && (a >= 0))
	b = 2;
}
else{				// else if (a < 0)
	b = 3;
}

주석으로 처리한 문장처럼 작성해도 되지만 이 경우에는 불필요한 조건 검사가 추가되므로 조건식의 순서를 고려하여 작성하면서 중복 검사를 줄이는 것이 좋다.
※ 참이 될 가능성이 많은 조건식을 먼저 작성하는 것이 조건식을 검사하는 횟수를 줄일 수 있다.

조건을 중첩하여 적용하기

서경대학교 학생 중 학점이 4.0 이상이면 장학금을 준다고 한다. 이 경우 서경대학교 학생인가를 먼저 검사한 후에 학점을 검사한다.

  • if문을 중첩하여 사용
  • switch ~ case문 사용

if문 중첩

if문 안에 if문을 넣어 사용한다.

if (서경대학교 학생이다){
	if (학점 >= 4.0){
    	장학금 지급
    }
    else{
    	장학금 미지급
    }
}

위 코드에서 if문의 실행문은 if ~ else문 한 문장이기 때문에 중괄호를 생략 가능하다.

if문을 중첩하여 사용하는 이유

위 코드를 if문 중첩 없이 연속된 if문으로 작성하면

if ((서경대학교 학생이다) && (학점 >= 4.0)){
	장학금 지급
}
if ((서경대학교 학생이다) && (학점 < 4.0)){
	장학금 미지급
}

이와 같이 논리곱(&&)을 사용하여 작성할 수 있다. 논리곱 연산은 두 조건을 모두 만족해야 참이 된다.
이 경우 if문의 조건식을 항상 검사하게 되지만 if문 중첩을 사용하면 "서경대학교 학생이다"라는 조건이 참이 될 경우에만 다음 조건을 따지게 되므로 불필요한 연산을 줄일 수 있다.

※ else 결합 문제

중첩 if문을 사용할 때에는 중괄호를 생략하지 않는 것이 좋다.

if (a < 0){				// ㉠
	if (b > 0){			// ㉡
    	printf("ok");
    }
}
else{
	printf("ok");
}

위 코드에서 문법적으로 ㉡의 실행문은 한 문장이므로 중괄호를 생략할 수 있지만 이 중괄호를 빼고 실행해보면 전혀 다르게 해석된다.
컴파일러는 if문이 중첩된 경우에는 else를 가장 가까운 if와 연결한다.
따라서 이 중괄호를 생략하면 else가 ㉠이 아닌 ㉡과 연결되어 ㉠의 실행문이 if ~ else문인 것으로 해석된다.
이 경우 초깃값이 a = 10, b = 20이라고 하면 아무것도 출력하지 않게 된다.

switch ~ case문

등수에 따라 상금을 지급한다. 1등 300만원, 2등 200만원, 3등 100만원, 나머지는 1만원을 지급한다.
여기서 조건은 등수이고 상수 1, 2, 3이다.
switch ~ case문은 이처럼 여러 상수 중에서 조건에 해당하는 하나를 골라 실행하는 것이다.

switch (rank)	// 조건식
{
case 1:			// 상수식1
	m = 300;	// 실행문1
    break;
case 2:			// 상수식2
	m = 200;	// 실행문2
    break;
case 3:			// 상수식3
	m = 100;	// 실행문3
    break;
default:
	m = 1;		// 실행문4
    break;
}
  • 조건식은 정수식만, 상수식은 정수만 사용한다.
  • 기본적으로 case 안에는 break을 작성해준다.
    ※ break을 만나면 switch문을 빠져나오게 된다.

break 생략

break을 항상 써야하는 것은 아니다. 필요에 따라 생략 가능하다.
위 식에서 break을 작성하지 않으면 rank = 1일 경우에 case1, case 2, case 3, default가 모두 실행되어 m의 값을 출력하면 1이 출력된다.

default

조건식에 일치하는 case 상수가 없을 경우나 마지막 case까지 break를 만나지 않았을 때에 실행된다.
필요하지 않을 경우에는 생략 가능하다.
switch의 안 아무곳에 작성해도 결과는 같지만 보통 모든 case문을 적은 다음 마지막에 작성한다.

switch ~ case문을 if문으로 바꾸기

if (rank == 1){
	m = 300;
}
else if (rank == 2){
	m = 200;
}
else if (rank == 3){
	m = 100;
}
else {
	m = 1;
}

출처) 혼자 공부하는 C언어

profile
노력형 인간

0개의 댓글