프로그래밍/C++

[정리] C++ 논리 표현식

Nessie! 2022. 12. 3. 02:12
본 게시글은 C++ 기초 플러스 책을 읽고 제가 필요할때마다 직접 읽어보려고 매우 대충 정리한 글입니다.

 

- 논리합 OR 연산자 (||)

둘 중 어느 하나 또는 둘 다 참일 경우 해당 표현식의 결과는 참이 된다.

즉, 논리합 연산자는 두 개의 표현식을 하나로 결합한다.

 

||연산자는 관계 연산자보다 우선순위가 낮기 때문에 소괄호는 필요없다.

ex)

5 == 5 || 5 == 9    // 첫째 표현식이 true라 둘째 표현식이 틀려도 true가 된다.

5 > 3 || 5 > 10

5 > 8 || 5 < 2      //둘 다 false라 false

5 > 8 || 5 < 10    // 둘째 표현식이 true라 true가 된다.

 

C++에서 ||연산자는 시퀀스 포인트로 작용한다.

즉, 좌변에 지시된 값의 변경은 우변이 평가되기 전에 일어난다. 

 

i++ < 6 || i == j

이런 식이 있다면, i++가 완료된 후 두 번째 식인 i == j의 비교가 이루어진다고 보면된다.

 

- 논리곱 AND 연산자 (&&)

두 개의 표현식이 모두 true일 때만 전체 표현식이 true가 된다.

마찬가지로 두 개의 표현식을 하나로 결합한다.

 

&&연산자 또한 마찬가지로 관계 연산자보다 우선순위가 낮기 때문에 소괄호는 필요없다.

ex)

5 == 5 && 5 == 9    // 둘째 표현식이 false라 결과는 false.

5 > 3 && 5 < 10      // 둘 다 true라 true

 

&& 연산자도 마찬가지로 시퀀스 포인트로 작용한다. 

 

- 논리부정 NOT 연산자 (!)

! 연산자는 뒤따르는 표현식의 값을 반대로 만든다. 즉, true였다면 false로, false였다면 true로 만들어준다.

bool값을 리턴하는 함수와 함께 사용하면 유용하다.

 

! 연산자는 관계 연산자나 산술 연산자보다 우선순위가 높다. 따라서 어떤 표현식을 부정으로 만들기 위해서는 그 표현식을 소괄호로 묶어줘야한다.

ex)

!(x > 5)  //x가 5보다 크다의 부정

!x > 5 //!x가 5보다 크다

 

 

- 논리 연산자의 고려 사항

논리곱 연산자는 논리합 연산자보다 우선순위가 높다. 따라서 다음과 같은 표현식은 

age > 30 && age < 45 || weight > 300

다음과 같이 인식된다.

(age > 30 && age < 45) || weight > 300

 

즉, (age > 30 && age < 45) 의 결과에 weight > 300 식과 OR연산을 해주는 것이다.

 

우선순위에 따라 괄호 없이 원하는대로 작성할 순 있겠지만, 필요 유무에 관계없이 괄호를 사용하여 조건들을 묶어주는 것이 좋다. 그렇게 하는 것이 훨씬 직관적이고 이해하는데 편해진다. (실수로 에러가 발생할 확률도 줄어든다)

 

C++에서는 논리 표현식을 평가할 때 왼쪽에서 오른쪽으로 평가를 진행하다가 전체 표현식의 값이 결정되는 순간 평가를 멈춘다.