본문 바로가기
개발/C, C++

단락 평가 Short Circuit

by 피로물든딸기 2021. 5. 11.
반응형

C, C++ 전체 링크

 

논리 연산에서 뒤의 수식과 상관없이 이미 판정 결과가 나온다면, 뒤의 수식은 수행될 필요가 없다.


AND 연산

 

A && B && C 에서 A가 false라면, B와 C는 true/false 여부에 상관없이 false다.

 

OR 연산

A || B || C 에서 A가  true라면, B와 C는 true/false 여부에 상관없이 true다.


C/C++에서 short circuit이 작동하는지 확인해보자.

먼저 아래의 코드를 실행해서 printf의 return 값을 알아보자.

#include <stdio.h>

int main(void)
{
	int pf1 = printf("hello\n");
	int pf2 = printf("world!!\n");

	printf("pf1 : %d, pf2 : %d\n", pf1, pf2);

	return 0;
}

printf는 출력하는 문자열의 길이를 return 한다.

pf1은 'h', 'e', 'l', 'l', 'o', '\n', 6개의 문자를 출력하여서 6을 return하였고,

pf2는 'w', 'o', 'r', 'l', 'd', '!', '!', '\n', 8개의 문자를 출력하기 때문에 8을 return하였다.


printf의 성질을 이용하여 short circuit을 test 해볼 수 있다.

 

먼저 AND 연산에 대한 short circuit이 작동하는지 확인해보자.

#include <stdio.h>

int main(void)
{
	int A, B;

	A = 1; B = 0;

	if (A && B++ && printf("short "))
		printf("circuit\n");

	printf("B : %d\n", B);

	return 0;
}

 

 

A = 1 (true)이기 때문에 && 연산은 뒤의 수식이 더 실행되어야 한다.

B = 0 (false)이기 때문에 뒤의 수식은 실행될 필요가 없다.

따라서 (A && B++ && printf("short")) == false 이기 때문에 "short circuit"은 출력되지 않는다.

 

하지만 A가 true라서 && 뒤의 B++은 수행이 되었기 때문에 if문 종료 후 B를 출력하면 1이 된다.


이제 B++ → ++B로 바꿔보자.

#include <stdio.h>

int main(void)
{
	int A, B;

	A = 1; B = 0;

	if (A && ++B && printf("short "))
		printf("circuit\n");

	printf("B : %d\n", B);

	return 0;
}

 

이 경우도 마찬가지로 A가 true이기 때문에 ++B가 수행된다.

하지만 B++은 후치연산이기 때문에 if문은 B = 0을 판단하고, 나중에 B가 1이 된다.

 

++B는 전치연산이기 때문에 먼저 B = 1이 되고 if문은 B를 true로 판단하여 다음 && 연산을 실행한다.

printf("short ")는 6을 return하므로 true가 된다.

if(true && true && true) printf("circuit\n");이 되기 때문에 printf가 short circuit을 모두 출력한다.

 

그리고 B는 1이 되었기 때문에 if문 종료 후에 1이 출력되는 것을 볼 수 있다.


이번에는 OR 연산에 대해 short circuit이 작동하는지 확인해보자.

#include <stdio.h>

int main(void)
{
	int A, B;

	A = 1; B = 1;

	if (A || B++ || printf("short "))
		printf("circuit\n");

	printf("B : %d\n", B);

	return 0;
}

 

A = 1 (true)이므로 뒤의 연산은 더 실행할 필요가 없다.

따라서 B++, printf("short ")는 실행되지 않고, if문은 true이기 때문에 circuit출력한다.


A = 1 → 0으로 바꾼 후 실행해보자.

#include <stdio.h>

int main(void)
{
	int A, B;

	A = 0; B = 1;

	if (A || B++ || printf("short "))
		printf("circuit\n"); 

	printf("B : %d\n", B);

	return 0;
}

A = 0 (false)이므로 뒤의 || 연산을 더 해봐야 한다.

B = 1 (true)이므로 B++은 실행되지만, printf("short ")는 더 실행할 필요가 없다.

따라서 circuit만 출력되고, B는 2가 출력된다.


OR 연산의 short circuit은 JavaScript에서 아래와 같이 쓰일 수 있다.

function setName(name) {
    return name || "defaultName";
}

setName 함수에 매개변수로 아무것도 들어오지 않으면 (undefined가 들어오면),

name은 false가 되므로 defaultName을 return하게 된다.

(JavaScript에서 undefinedfalse다.)

 

setName에 이름을 넣어주면, name = true가 되기 때문에 뒤의 || 은 실행되지 않고, name을 그대로 return한다.

 

따라서 매개변수가 정의되지 않는 경우에 default를 설정할 수 있는 함수를 가독성 좋게 만들 수 있다.

반응형

'개발 > C, C++' 카테고리의 다른 글

C++ - 컨테이너와 반복자 (Container and Iterator)  (0) 2021.06.11
C++ - 인라인(inline) 함수  (0) 2021.05.19
C++ split 함수 구현  (0) 2021.05.08
typedef 선언  (0) 2021.05.02
C++ 포인터와 참조자 (pointer vs reference)  (1) 2021.05.01

댓글