0

我有這樣的表達:認識到如果再執行表達式可以跳過

(a and b or c) and d 

我怎麼會認識到它的進一步執行是沒有意義的。例如,當

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

它沒有意義執行最外層(...) and d becouse整個表達式將是假的(a and b or c)返回後假。

所以我想找到一個一般的規則,讓我來分析對錶達爲主,找到表達的那些部分,其執行對整個表達至關重要,如果需要跳過進一步執行。下面是基於堆棧的假想代碼虛擬機我是來自

ld a 
ld b 
and 
ld c 
or 
ld d 
and 

開始與此表達我想實現什麼:

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

一般短路'和'和'或'運營商簡單地編譯爲條件分支('x和y' ==='如果x那麼y別的FALSE','x或y' ==='如果x那麼真正的其他y'),而不是'和'或'或'指令。 – sepp2k

+0

這是罰款標量進行比較,但如果'A,B,C或D',你可能要回顧懶表情,或延期,評估與短circuting一起。 –

+0

1.爲什麼downvotted? 2. @ sepp2k,你可以把你的評論作爲回覆?我想將您的迴應標記爲解決方案,因爲這正是我所尋找的。答案是短路 – Puchacz

回答

1

不計算布爾的右操作數的概念運營商時的結果已經被左操作數確定的,被稱爲短路。它通常是通過編譯andor運營商相同的代碼作爲條件表達式實現:

  • a and b將相當於a ? b : false(或a ? b : a
  • a or b將相當於a ? true : b(或a ? a : b

所以生成的字節和/或機器代碼將不包含任何andor指令,但只是一個條件ONAL分支。