c언어의 논리연산자는 조건식이나 값을 논리적으로 판단할 때 사용한다.
종류:
&&-> AND(논리곱), 양쪽 모두 참일때 참
||-> OR(논리합), 둘 중 하나라도 참이면 참
! -> NOT(논리부정), 참과 거짓을 뒤집음
AND연산자는 &&처럼 두 개의 &으로 되어있으며 하나만 사용하면 AND비트연산자가 되므로 주의해야 한다.
&&연산자는 두 값이 모두 참이어야만 참이다
이때문에 '단락평가'가 중요하다.
논리연산자에서 중요한 부분이 '단락평가'이다. 단락평가란 첫번째 값만으로 결과가 확실할 때 두번째 값을 확인(평가)하지 않는 것이다.
AND연산자를 예로 들면 AND연산자는 두 값이 모두 참이어야만 참이기 때문에 첫 번째 값이 거짓(0)이면 두 번째 값을 확인하지 않고 거짓(0)을 반환 한다.
OR연산자는 ||처럼 두 개의 |으로 되어있으며 하나만 사용하면 OR비트연산자가 되므로 주의해야 한다.
|| 연산자는 두 값 중 하나라도 참이면 참을 반환한다.
|| 연산자는 두 값 중 하나만 참이면 참이므로 단락평가에서 첫 번째 값이 참이면 두번째 값을 확인하지않고 참을 반환한다.
!연산자는 값, 변수, 함수 앞에 !을 붙여서 사용한다.
!연산자는 참은 거짓으로 거짓은 참으로 논리값을 뒤집는다.
printf("%d\n", !(1&&1));
>>> 0
이처럼 값에 논리식에 !을 붙이면 참이었던 값이 거짓(0)을 반환한다.
printf("%d\n", (10 > 20) || (1 < 2));
printf("%d\n", !(10>20) && 1);
>>> 1
>>> 1
논리연산자는 두 개의 조건식 사이에 사용하여 판단할 수 있다.
(10>20) || (1<2): 10>20은 거짓(0)이지만 1<2이 참이므로 OR연산자(||)은 참을 반환한다.
!(10>20) && 1: 10>20은 거짓(0)이지만 논리부정(!)을 붙여서 참(1)이되고 둘다 0이 아닌 참이기 때문에 AND연산자(&&)는 참읗 반환한다.
&&연산자의 단락평가를 활용하면 문제가 발생하는 코드를 예방할 수 있다.
if ((num1 != 0) && (num2/num1) < 20)
num1 == 0이면 (num2/num1) <20을 계산하기 전에 거짓을 반환하므로 정수를 0으로 나눔으로 인한 오류를 예방할 수 있다.