제어문은 크게 선택문, 반복문, 분기문으로 나누어진다.
선택문 : 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 |