对于没有副作用的简单表达式(例如给定的表达式),求值的顺序无关紧要(1)。这意味着您可以首先检查“快速”情况( c == b
在本例中,即执行代码最少的情况)。
汇编 a
中,它基本上是这样的(假设 ax
, b
在 bx
, c
中 cx
):
cmp bx, cx ; check b == c?
jeq is_true ; final result is true.
cmp ax, cx ; otherwise b != c, so check a <= c?
jle is_false ; if so, final result is false.
cmp ax, bx ; otherwise a > c, so check a == b?
jeq is_true ; if so, final result is true.
is_false:
; do false bit ; otherwise final result is false.
jmp next
is_true:
; do true bit
next:
; carry on
如果没有错误位,它可以简化为:
cmp bx, cx
jeq is_true
cmp ax, bx
jne next ; no false bit, next statement.
cmp ax, cx
jle next ; no false bit, next statement.
is_true:
; do true bit
next:
; carry on
(1)如果表达式包含副作用,则求值的顺序可能变得很重要,因为可能会出现短路求值。我的意思是考虑如下表达式(伪代码):
if a == b and c == d:
do_something()
在这种情况下,一旦你确定 a
和 b
是平等的,就没有必要比较 c
和 d
.
我没有讨论过这个问题(除了在这个脚注中),因为:
-
p6
-
p7