我有这样的表达:
(a and b or c) and d
我怎么认识到它的进一步执行没有意义。例如
时a = 0, b = 1, c = 0, d = 1
执行最外层的 (...) and d
是没有意义的,因为(a and b or c)
返回false后整个表达式将为false。
所以我试图找到一个允许我分析表达式的一般规则,并在此基础上找到执行对整个表达式至关重要的表达式部分,并在必要时跳过进一步执行。下面是基于堆栈的虚拟机的假设代码,表达式是从
开始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:
答案 0 :(得分:1)
当结果已由左操作数确定时,不评估布尔运算符的右操作数的概念称为短路。它通常通过将and
和or
运算符编译为与条件表达式相同的代码来实现:
a and b
等同于a ? b : false
(或a ? b : a
)a or b
等同于a ? true : b
(或a ? a : b
)因此,生成的字节和/或机器代码不会包含任何and
或or
指令,只会包含条件分支。