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分支。