0

를 생략 할 수있는 경우 나는 그런 표현이 인식 :더 표현의 실행이

(a and b or c) and d 

나는 그것이 이해가되지 않습니다 더 실행의 인식 할 방법을. 이 의미는 (a and b or c) 복귀 후 거짓 거짓이 될 것입니다 전체 표현식 렸기 때문에 외부 가장 (...) and d을 수행하지 않습니다

a = 0, b = 1, c = 0, d = 1 

예를 들어.

그래서 표현식을 분석하고이를 기반으로 전체 표현식에서 실행이 중요하고 필요한 경우 추가 실행을 건너 뛰는 표현식 부분을 찾습니다. 부울의 오른쪽 피연산자를 평가하지 않는

ld a 
ld b 
and 
ld c 
or 
jmpf outOfQuery ;;jump if false 
ld d 
and 
outOfQuer: 
+2

일반적으로'and' 및'or' 연산자는 간단히 조건 분기로 컴파일됩니다 ('x와 y' ==='x이면 y 거짓,'x 또는 y' ==='x then else'y'),'and'or'or'명령이 아니다. – sepp2k

+0

스칼라 비교에서는 괜찮습니다.하지만 'a, b, c 또는 d'가 표현식이면 짧은 순환과 함께 지연 또는 지연 평가를 검토하는 것이 좋습니다. –

+0

1. 이유는 무엇입니까? 2. @ sepp2k, 답장으로 의견을 기재 할 수 있습니까? 내가 찾고있는 것이기 때문에 귀하의 답변을 해결책으로 표시하고 싶습니다. 대답은 단락 중입니다. – Puchacz

답변

1

개념 : 아래 스택의 가상 코드는 내가 달성하고자하는 내가이 함께

ld a 
ld b 
and 
ld c 
or 
ld d 
and 

에서 시작하고 표현과 가상 머신을 기반으로 연산 결과가 왼쪽 피연산자에 의해 이미 결정된 경우 연산자를 단락이라고합니다. 그것은 일반적으로 동일한 코드에 같은 조건식을 andor 연산자를 컴파일하여 구현됩니다

  • a and ba ? b : false (또는 a ? b : a)
  • a or b에 해당 될 것이다 a ? true : b (또는 a ? a : b)
  • 에 해당 될 것

따라서 생성 된 바이트 및/또는 기계 코드는 and 또는 or 명령어를 포함하지 않지만 단지 condit onal 가지.