프로그래밍

c언어/c++ if 조건문

업글 2020. 12. 17. 00:40

안녕하세요 업글입니다. 이번 포스팅에서 if 조건문에 대해서 설명드리겠습니다.

 

개인적인 생각으로 if문은 c언어 및 c++뿐만아니라 모든 프로그래밍 언어에서 가장 중요한? 없어서는 안되는? 중요하고 필수적으로 쓰여야 하는 문법이라고 생각합니다. 학부 시절에 포인터와 같은 초보자가 알지 못하고 이해하기 힘든 문법이 많은 상황에서도 조건문과 반복문을 통해서 대부분의 기능을 구현 했었던 기억이 있습니다.

 

if 조건문에 대한 설명

if 조건문은 괄호안의 조건이 참인 경우 if 조건문에 해당하는 코드를 실행하게 됩니다.

if(조건){
	// 조건이 참인 경우 { } 안의 코드 실행
}

여기서 조건이 참이냐 거짓이냐를 판단하는 기준은 if(0)인 경우 거짓이고 if(0외에 숫자)인 경우 참입니다.

if(참){
	// { } 안에 있는 코드가 실행된다.
}

if(거짓){
	// { } 안에 있는 코드가 실행되지 않는다.
}
// 해당 위치에서 코드 실행 시작

조건이 참인 경우 { }안에 있는 코드들이 실행되며 조건이 거짓인 경우 { }안에 있는 코드들이 실행되지 않고 { } 아래에서 코드 실행이 시작되게 됩니다.

 

간단한 예제 코드를 보면서 설명드리겠습니다.

#include <stdio.h>
#include <stdint.h>

int32_t Getvalue() 
{
	int32_t result;

	result = 0;

	return result;
}


int main()
{
	int32_t value;

	value = Getvalue();

	if (value == 0) {
		printf("value = 0\n");
	}

	if (value == 1) {
		printf("value = 1\n");
	}

	return 0;
}

위의 코드에서 value는 0이기 때문에 첫번째 조건문에서는 참이고 두번째 조건문에서는 거짓이므로 아래의 그림과 같은 결과를 출력하게 됩니다.

if, else if, else에 대한 설명

if를 사용하여 해당하는 조건일 때만 if문의 { } 내부 코드를 실행 할 수 있습니다. 여러 조건이 필요한 경우에 어떻게 나타낼수 있을까요? 아래의 코드와 같이 if문을 여러 개 사용하여 나타낼 수 있습니다.

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h >

int32_t Getvalue()
{
	int32_t result;

	result = rand() % 3;

	return result;
}


int main()
{
	int32_t value;

	value = Getvalue();

	if (value == 0) {
		printf("value = 0\n");
	}

	if (value == 1) {
		printf("value = 1\n");
	}

	if (value == 2) {
		printf("value = 2\n");
	}

	return 0;
}

위의 코드에서는 value가 0, 1, 2일 때 각각 조건에 대하여 if문을 사용하였습니다. 

위의 코드에서 value가 0이라고 가정했을 때 첫번째 if문에서 참이기 때문에 해당하는 코드를 실행하게됩니다. 두번째, 세번째 if문에서는 value가 0이기 때문에 거짓이지만 조건을 확인하게 됩니다. 이러한 경우에 if, else if, else를 사용하여 처리할 수 있습니다.

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h >

int32_t Getvalue()
{
	int32_t result;

	result = rand() % 3;

	return result;
}


int main()
{
	int32_t value;

	value = Getvalue();

	if (value == 0) {
		printf("value = 0\n");
	}
	else if (value == 1) {
		printf("value = 1\n");
	}
	else{
		printf("value = 2\n");
	}

	return 0;
}

if, else if, else를 사용했을 때 value가 0이 아닌 경우 그 다음 else if 조건인 value가 1인지 확인하고 1이면 해당하는 코드를 실행하고 value가 1이 아닌 경우 else에 해당하는 코드를 실행하게 됩니다.

if만 사용하는 경우와 다르게 value가 0인 경우 if문의 조건이 참이기 때문에 해당하는 코드만 실행하고 else if, else에 대한 조건은 확인하지 않습니다.

 

단락평가(short circuit evaluation)에 대한 설명

(1 || 0) // 첫번째 항에서 이미 1이기 때문에 || 뒤의 조건은 확인하지 않고 1로 출력
(0 && 1) // 첫번째 항에서 이미 0이기 때문에 && 뒤의 조건은 확인하지 않고 0으로 출력

위의 코드에서 보듯이 단락평가란 ||연산자를 사용하는 경우 첫번째 항에서 1이면 뒤의 조건에 관계없이 1이되기 때문에뒤의 조건을 확인하지 않고 1을 출력하며 &&연산자를 사용하는 경우 첫번째 항에서 0이면 뒤의 조건에 관계없이 0이되기 때문에 뒤의 조건을 확인하지 않고 0을 출력하는 것입니다.

if 조건문에서 ||, &&연산자를 사용하여 조건식을 구성하는 경우가 많으므로 단락평가를 고려하여 보다 코드를 효율적으로 작성하실 수 있습니다.

아래의 코드를 통해서 설명드리겠습니다.

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h >


int main()
{
	int32_t value = 0;
	int32_t count = 0;

	// value가 0이므로 첫번째 항이 참이 되기 때문에 || 뒤의 조건 실행 X
	if (value == 0 || (count = 1)) {
		printf("|| short circuit evaluation\n");
	}

	// value가 0이므로 첫번째 항이 거짓이 되기 때문에 || 뒤의 조건 실행 X
	if (value == 1 && (count = 1)) {
		printf("&& short circuit evaluation\n");
	}
	
	printf("count = %d\n", count);

	return 0;
}

단락평가로 인해서 첫번째 if문에서 value == 0은 참이기 때문에 || 뒤의 조건을 실행하지 않게되고 두번째 if문에서 value == 1은 거짓이기 때문에 && 뒤의 조건을 실행하지 않게됩니다. count가 0인 것을 보아 뒤의 조건을 실행하지 않은 것을 확인할 수 있습니다. 그러므로 ||를 사용하는 경우 참이 될 가능성이 높은 조건을 앞에 작성하고 &&를 사용하는 경우 거짓이 될 가능성이 높은 조건을 뒤에 작성하면 보다 효율적으로 속도를 빠르게 할 수 있습니다. PC와 같은 환경에서는 큰 차이가 없으므로 고민하지 않아도 되지만, 가격이 저렴한 MCU와 같은 하드웨어에서 속도를 최적화 해야하는 경우 적용을 할 수도 있을 것 같습니다.

 

if 조건문 사용 시 주의 사항

if문에서 ==연산자를 사용하는 경우 실수로 ==대신 =을 입력할 수 있습니다. 이러한 경우 if문은 의도하지 않은 동작을 하게 됩니다. "= 0"인 경우 무조건 거짓으로 판단되며 "= 0이외 숫자"인 경우 무조건 거짓으로 판단하게 됩니다. 이러한 경우 컴파일러에서 오류로 출력해주지만 에러로 출력해주지 않기 때문에 주의할 필요가 있습니다.

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h >


int main()
{
	int32_t value = 0;

	// 의도한 코드 : value == 0
	if (value = 0) {
		printf("value가 0이므로 무조건 실행되지 않는다.");
	}

	// 의도한 코드 : value == 1
	if (value = 1) {
		printf("value가 1이므로 무조건 실행된다.");
	}

	// 실수를 예방하기 위한 코드
	// 0 = value가 되면 오류 출력
	if (0 == value) {

	}

	// 실수를 예방하기 위한 코드
	// 1 = value가 되면 오류 출력
	if (1 == value) {

	}

	return 0;
}

위의 코드에서 첫번째, 두번째 if문은 실수로 인해서 작성된 코드이고 첫번째 if문은 무조건 실행될 수 없으며 두번째 if문은 무조건 실행되게 됩니다.

이러한 실수를 예방하기 위해서 상수를 왼쪽에 두는 방법이 있습니다. 상수를 왼쪽에 두게 되면 상수는 변경될 수 없기 때문에 에러가 발생되게 됩니다. 그러나 보편적으로 상수를 오른쪽으로 두기 때문에 가독성은 조금 떨어질 것으로 생각됩니다.

 

if문을 포함한 if/else if/else, 단락평가, if문 주의사항에 대한 포스팅은 이상 마치도록 하겠습니다.

'프로그래밍' 카테고리의 다른 글

c언어/c++ do while문  (2) 2020.12.18
c언어/c++ while문  (0) 2020.12.17
c언어/c++ 속도 최적화 메디안필터  (0) 2020.12.16
c언어/c++ 메디안필터  (0) 2020.12.14
c언어/c++ 이동평균필터  (0) 2020.12.13