본문 바로가기

Language/C++

C++ 논리연산자 복습

	// short circuit evaluation  - > y 의 값이 3이 나오는 이유?  
	int x = 1;
	int y = 2;

	if (x == 1 && y++ == 2)
	{
		 // do something
	}

	cout << y << endl;​
#include <iostream>

int main()
{
	using namespace std;
	
	bool x = true;
	bool y = false;

	// logical NOT
	cout << !x << endl;

	// logical AND
	cout << (x && y) << endl;

	//logical OR

	cout << (x || y) << endl;

	//XOR 명제 중 하나만 참일 경우 참을 return 
	// false		false		false
	// false		true		true
	// true		    false		true
	//	true		true		false

	if (x != y) // C++에는 XOR을 따로 나타내는 연산자가 없으므로 이렇게 표현
	{
		// do something
	}

논리연산자에는 AND, OR, XOR이 있다.

AND는 &&으로 표시되고 왼쪽 오른쪽 두 operand가 전부 True 일때만 True를 return하고

false가 적어도 하나 이상 있다면 False를 return 한다.

OR 은 ||으로 표시되고 operand 중 하나라도 true가 있으면 True를 return, 하나라도 false가 있다면 false를 return 한다.

XOR은 두 명제 중 하나만 참일 경우에 True를 return 하고 둘 다 false거나 true라면 False를 return한다.

 

	// De Morgan's Law
	!(x && y);
	!x || !y;

논리연산자에는 수학과 마찬가지로 드모르간 법칙이 적용된다.

드모르간 법칙이란 논리곱의 부정은 각각 부정의 논리합과 같다는 뜻이다.

더 풀어서 설명하면, not은 분배될때 전부 반대로 바꾼다. (AND -> OR로, OR -> AND로, 집합은 여집합으로)

 

< EX_1) 논리연산자의 특징 1> 

bool v1 = true;

bool v2 = false;

bool v3 = false;


bool r1 = v1 || v2 && v3;

bool r2 = (v1 || v2) && v3;

bool r3 = v1 || (v2 && v3);


cout << r1 << endl;

cout << r2 << endl;

// &&가 ||보다 우선순위가 높다.

논리연산자에서 &&(AND)가 ||(OR) 보다 우선순위가 높다. 헷갈리면 그냥 미리 괄호를 쳐두자.

여기서 r1이 의미하는 바는 r3와 같다.

 

<EX_2) 논리연산자의 특징 2>
	// short circuit evaluation  - > y 의 값이 2가 나오는 이유?  
	int x = 2;
	int y = 2;

	if (x == 1 && y++ == 2)
	{
		 // do something
	}

	cout << y << endl;
출력: 2
	// short circuit evaluation  - > y 의 값이 3이 나오는 이유?  
	int x = 1;
	int y = 2;

	if (x == 1 && y++ == 2)
	{
		 // do something
	}

	cout << y << endl;
출력: 3

이유는 다음과 같다.

&& 연산자는 왼쪽에서 부터 확인한다. 첫번째 예제에서 이미 x ==1이 아니므로 뒤에 구문은 보지 않고 바로 다음 구문으로 넘어가기 때문에

뒤에 계산인 y++은 확인하지 않고 넘어간다. 따라서 첫번째 예제에서는 y 출력시 그대로 2이고, 두번째 예제에서는 앞의 x가 true를 만족하므로 뒤에 y항도 보기 때문에 출력 값이 3이 된다.

(** y ++은 해당 문장을 수행한 후 +1을 처리하겠다는 것이다. //// ++y는 먼저 +1한 뒤에 ++y가 들어있는 해당 문장을 처리하겠다는 것이다.)

<EX_3)>	
bool x = 5;
bool y = 7;
if (x != y) // if (!x == y)는 틀린 표현 ! Why?
	{
		cout << :"x does not equal y" << endl;
	}
	else
		cout << "x equals y" << endl;

if (!x == y)가 틀린 표현인 이유는 !가 우선순위가 높아서 먼저 실행되기 때문이다. 따라서 해당 표현을 사용해 if문을 실행했을 때,

!5는 false가 되므로 (0이 아닌 모든 숫자는 true로 간주된다.) if ( false = true ) 로 간주된다. 따라서 5와 7은 다름에도 else문이 실행되어 둘은 같다고 나온다.

반면 if(x !=y)는 정확하게 5와 7이 같지 않다고 나온다.