// 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이 같지 않다고 나온다.