[C언어] 조건문 If ~ else if ~ else 총정리 - 쉽게 하는 실수들까지
조건문 if
C언어를 배우는 중에 조건에 따라 실행흐름을 분기시키는 예약어인 if문에 대해서 자세히 알아보도록 합시다. if문와 else if는 괄호에 조건식을 써주는데요. 이 조건에 따라 실행을 다르게 시킬 목적으로 사용이 됩니다. 아래와 같은 방식으로 사용하게 됩니다. 이제 예제를 보면서 하나씩 이해하도록 합시다.
if(조건 1){
//실행 1//
} else if(조건 2){
//실행 2//
} else if(조건 3){
// ... //
} else if(조건 n){
//실행 n//
}else{
//그 외 실행
}
1. if 단독 사용법
if문은 다음과 같이 괄호 안에 비교식을 써주면 되는데요. 이때 괄호식 안에 조건이 참이 되는 경우에만, if안의 코드를 실행하게 됩니다. if 안의 문장이 한문장일 경우에 아래의 중괄호는 생략이 될 수 있습니다.
#include <stdio.h>
void main() {
int a = 10;
if (a == 10) { //if안의 구문이 한 줄이면 '{' 생략가능
printf("a = 10\n");
}//if안의 구문이 한 줄이면 '}' 생략가능
printf("종료\n");
}
위의 코드는 아래와 같이 수행이 됩니다. a가 5라면 if안에 printf는 호출이 되지 않지요.
2. if ~ else ~ 구문 예제
if에 조건에 맞지 않는 조건을 수행할 때에는 else 구문을 이용할 수 있습니다.
#include <stdio.h>
void main() {
int a = 2;
if (a == 10) {
printf("a의 값은 10.\n");
}
else {
printf("a의 값은 10이 아님.\n");
}
}
아래는 위 코드의 결과입니다.
3. 조건이 여러가지일 경우 else if
조건이 여러 가지가 있을 경우에는 else if를 통해서 여러 조건을 줄 수가 있습니다. if 부터 순차적으로 아래쪽으로 비교해서 그 중 참이 되는 경우에 있는 블록만 실행하고 바로 if문을 빠져나옵니다.
#include <stdio.h>
void main() {
int a = 3;
if (a >= 5) {
printf("a의 값은 5 이상\n");
}
else if (a >= 2) {
printf("a의 값은 2 이상\n");
}
else {
printf("a의 값은 2 미만\n");
}
}
#include <stdio.h>
void main() {
int score = 85;
if (score >= 90) {
printf("학점 A\n");
}
else if (score >= 80) {
printf("학점 B\n");
}
else if (score >= 70) {
printf("학점 C\n");
}
else if (score >= 60) {
printf("학점 D\n");
}
else {
printf("학점 F\n");
}
}
4. 조건이 참인 경우 = 0이 아닌 경우
C, C++에서 거짓의 조건은 간단합니다. 0만 false라고 간주한다는 것이죠. 그 외의 모든 수는 전부 참으로 간주합니다. 즉, 여기 if문이나 else if에서 조건이 참인 경우는 0이 아닌 경우입니다. 0외에 숫자는 모두 참으로 간주하게 됩니다. 그래서 아래의 코드중 a와 b가 참이되는 이유입니다.
#include <stdio.h>
void main() {
int a = 1;
int b = -1;
int c = 0;
if (a) {
printf("a는 true\n");
}
if (b) {
printf("b는 true\n");
}
if (c) {
printf("c는 true\n");
}
printf("종료\n");
}
5. &&조건과 || 조건
&&(논리 AND 연산)은 모든 조건이 전부 true여야 true이고, ||(논리 OR 연산)은 모든 조건중에 하나라도 true이면 true입니다.
#include <stdio.h>
void main() {
int a = 1;
int b = 2;
if (a == 1 && b == 2) {
printf("a=1이고 b=2이다.");
}
else {
printf("a=1이 아니거나, b=2가 아니다.");
}
}
6.1 하기 쉬운 실수1 (모든 비교문이 수행이 되지 않음)
다음은 if문이나 조건식에서 흔하게 하기 쉬운 실수입니다. 아래의 코드를 예측해보시기 바랍니다.
#include <stdio.h>
void main() {
int a = 10;
int b = 20;
if (a > 10 && (b++) > 20) {
printf("실행이 될까요?\n");
}
printf("b의 값:%d\n", b);
}
조건을 보게 되면 a는 10보다 크지 않죠. 딱 10이니까요. 그렇다면 a>10은 false가 됩니다.
그리고 다음 조건에서 b를 선증가시킨 후 20과 비교합니다. b는 21의 값이 되겠네요. 그렇다면 b>20의 조건은 true가 되겠네요.
그렇다면 if문 안의 printf는 실행이 되지 않겠네요. 그렇다면 b의 값은 얼마일까요? 아래 결과 화면입니다.
b의 값은 고스란히 20입니다. 조건식에서 비교할때 &&이나 ||이 오게 되면 true나 false가 확정일 경우에는 그 뒤의 식은 보지도 않고 건너 뛰어버립니다. 그래서 b++은 수행되지 않게 되죠. 그래서 b가 21로 나오게 할 경우에는 아래와 같이 수정이 되어야 21이 나오게 됩니다.
#include <stdio.h>
void main() {
int a = 10;
int b = 20;
if (a > 9 && (b++) > 20) {
printf("실행이 될까요?\n");
}
printf("b의 값:%d\n", b);
}
6.2 하기 쉬운 실수 2 (실수로 값 대입)
== 연산자나 != 연산자를 사용할때 흔히 이런 실수를 많이 하게 됩니다. 아래의 코드는 원래 finished == 1일 경우 프로그램이 종료되야하는 조건입니다. finished가 그전에 0이기 때문에 if문을 수행하지 않는것이 프로그래머의 의도입니다. 하지만 코드에서 프로그래머의 실수로 '=' 하나 빠지는 바람에 finished=0에서 finished=1로 대입이 되었고, if문이 실행이 됩니다.
#include <stdio.h>
void main() {
int finished = 0;
if (finished = 1) { //이 식은 문법상 문제가 없는 문장이므로 에러없이 컴파일됨
printf("finished\n");
}
}
이런 오류들은 컴파일에서 잡아낼 수 없으며 찾는데도 오래 걸리게 됩니다. 따라서 비교식을 쓸때 상수는 왼쪽에 쓰는 것이 이런 휴먼 에러를 막을 수 있습니다.
이렇게 빨간색으로 뜨니까 컴파일단계에서 바로 알 수 있고 아래처럼 올바르게 수정하여 프로그램을 더 안전하게 만들 수 있습니다.
#include <stdio.h>
void main() {
int finished = 0;
if (1 == finished) {
printf("finished\n");
}
}
여기까지 C언어의 if문에 대해서 알아보았습니다. if문은 어렵지는 않지만 비교문이 끝까지 비교가 진행이 되는지 되지 않는지 모르는 것과 아는 것은 다릅니다. 공부하는데 도움이 되었으면 좋겠습니다.