자습

실험실) ||(OR 연산자)의 결합 방향과 특징

hyrule 2022. 11. 13. 19:29

|| 연산자(OR)의 특징은 논리검사 대상 중 하나라도 true가 반환될 경우 true를 반환한다.

그리고 || 연산자의 결합 방향은 →(오른쪽) 방향이다.

 

그렇다면 아마 C++에서는 최적화를 위해서

왼쪽 파트의 논리 검사에서 true가 반환된다면

오른쪽 파트는 검사를 스킵하지 않을까? 라는 의문이 들었다.

바로 실험해보자

 

#include <iostream>
#include <vector>


int main()
{
	
	std::vector<int> vecIntPtr;

	vecIntPtr[0] = 1;
	
	return 0;

}

우선 위의 코드를 실행 시키면 vecIntPtr에는 원소가 하나도 추가되지 않았으므로 0번 인덱스를 강제로 참조하게 되면 아래와 같은 에러가 발생한다.

 

 


 

또한 std::vector의 empty() 함수는 생성한 벡터 컨테이너가 비어있을 경우 true를 반환한다.

#include <iostream>
#include <vector>


int main()
{
	
	std::vector<int> vecIntPtr;

	if (vecIntPtr.empty())
		printf("비어있음!");

	return 0;
}

 

 


 

 

그렇다면 || 연산자를 통해서

(비어있는지 확인) || (0번 인덱스의 값을 체크) 하게 되면

(비어있는지 확인) 하는 과정에서 true가 반환되고,

(0번 인덱스의 값을 체크)하는 과정에서는 비어있는 벡터 컨테이너를 강제로 참조하므로 에러가 발생한다.

 

그런데 만약 여기서 왼쪽의 논리검사에서 true를 확인했을 때

더 이상 논리검사를 하지 않고 스킵하게 된다면

에러가 발생하지 않을 것이다.

 

#include <iostream>
#include <vector>


int main()
{
	
	std::vector<int> vecIntPtr;

	if (vecIntPtr.empty() || vecIntPtr[0] == 0)
		printf("정상동작");

	return 0; 
}

 

 

혹시나 싶어서 3중으로도 해 보았으나

#include <iostream>
#include <vector>


int main()
{
	
	std::vector<int> vecIntPtr;

	if (true || vecIntPtr.empty() || vecIntPtr[0] == 0)
		printf("정상동작");

	return 0; 
}

마찬가지로 에러가 발생하지 않았다.

 

 

 

결론

|| 연산자는 왼쪽에서부터 논리검사를 하며,

검사 과정에서 true가 하나라도 발견되면 더이상 검사하지 않고 바로 true를 반환한다.