처음엔 확실히 논리 연산자에 대해 배우면 어렵긴 할 듯하다. 대학교 1학년 때 C언어를 하면서 논리연산자 들어갈 때 접고 싶은 마음이 굴뚝 같았던 기억이 난다. 하나씩 파헤쳐 보자.
#include <iostream>
int main()
{
using namespace std;
bool x = true;
bool y = false;
cout << (x && y) << endl;
cout << (x || y) << endl;
return 0;
}
output = 0
1
혹시나 해서 그런데 &
와 |
는 비트 관련 연산자로 헷갈리면 큰일난다. 논리 연산자는 항상 두개씩이다.(번외로 !
와 같이 Not 연산자는 하나다.)
#include <iostream>
int main()
{
using namespace std;
int x = 1;
int y = 2;
if (x == 1 && y++ == 2)
{
//do something
}
cout << y << endl;
return 0;
}
output : 3
이 코드 같은 경우에는 당연히 3이 나온다고 생각할 것이다. 근데,
#include <iostream>
int main()
{
using namespace std;
int x = 2;
int y = 2;
if (x == 1 && y++ == 2)
{
//do something
}
cout << y << endl;
return 0;
}
output : 2
???????모지? 모지?뭐지? 내가 바꾼 것은 int x = 2
하나 뿐이다. 그런데 왜 이렇게 바뀔까? 왜 y++ == 2
를 실행하지 않지? 라고 생각할 수 있다. &&
연산자는 앞의 논리 부터 동작시킨다. 만약 이것이 올바르지 않다면 뒤의 논리는 아예 작동조차 시키지 않는다. 따라서 y++이 작동되지 않아 원래 y가 갖고 있는 2가 출력된 것을 알 수 있다.
또 드모르간의 법칙도 있긴 한데
#include <iostream>
int main()
{
using namespace std;
bool x = true;
bool y = false;
!(x && y);
!x && !y;
//!x || !y
return 0;
}
이 코드는 잘못된 코드이다. !x && !y
를 주석으로 된 코드로 바꿔야 둘이 동일한 작동을 한다. 실수 많이 할 수 있으므로 참고하도록 한다. 아님 드모르간의 법칙에 대한 공부를 하고오면 쉽게 이해할 수 있다.
C++에는 XOR 연산자가 없다. 이는 코딩으로 만들어 줘야 한다.
https://ko.wikipedia.org/wiki/C%EC%99%80_C%2B%2B%EC%9D%98_%EC%97%B0%EC%82%B0%EC%9E%90
혹시나 하지만 논리 연산자들도 각각의 우선순위가 있기 때문에, 참고하여 코드를 짜도록 한다. 아니면 괄호를 쳐서 우선순위를 직접 정해주자. 이게 진짜 좋은 방법!!