논리 연산자인 and(&&), or(||)에서 short-circuit evaluation 방식
게시일 : 2019년 02월 01일
# Python
# Java
# Short-circuit
논리 연산자인 and(&&), or(ll)에서 short-circuit evaluation에 대해 알아본다.
python에서 &와 and가 같은 의미인 줄로 알았다가 최근에 다름을 알게 되었다.
Short-circuit evaluation
AND와 OR에서는 첫 번째 조건의 결과에 따라 두 번째 조건을 확인하지 않아도 결과가 정해진다. 따라서, 두 번째 조건 실행을 하지 않는 것이 효율적이다.
이 방식을 Short-circuit evalutaion이라고 한다. (알고는 있었지만 이런 용어가 있는 지는 몰랐다.)
논리 연산 | 첫 번째 조건 | 결과 |
---|---|---|
A AND B | A - False | False |
A OR B | A - True | True |
eager operator VS short-circuit operator
eager operator는 첫 번째 조건과 상관없이 두 번째 조건을 실행한다.
eager operator는 bit operator와 모양이 같지만 조건 결과가 boolean이면 eager operator로 쓰인다.
언어 | eager | short-circuit |
---|---|---|
Python | & / l | and / or |
Java | & / l | && / ll |
참고 : C에서는 eager operator는 사용하지 않는다.
아래 위키피디아를 확인하면 다른 언어에서도 존재하는 것을 확인할 수 있다.
python
두 번째 조건이 실행이 되면 ZeroDivision 에러가 발생한다.
a, b = 10, 5
# eager - 두 번째 조건을 실행하기 때문
a < 0 & (b/0) == 0 => ZeroDivisionError
# short-circuit - 첫 번째 조건에서 종료
a < 0 and (b/0) == 0 => False
Java
Java는 증감연산자를 활용해서 테스트해보았다. 두 번째 조건의 실행여부에 따라 y값이 달라지는 걸 확인할 수 있다.
int x = -1; int y = 0; boolean z =;
// eager
z = x>0 & ++y == 1;
System.out.println(y); => 1
// short-circuit
z = x>0 && ++y == 1;
System.out.println(y); => 0
References
: