假设我们要评估(A || B || C)
的布尔值
这在逻辑上等于!(!A && !B && !C)
。
如果(!A)为假,因为整个表达式值变为false,使用!(!A && !B && !C)
比使用~
更节省时间吗?该计划会注意到吗?或者程序仍然需要在返回最终结果之前评估(!B)和(!C)的值?
P.S。只需更正de'Morgan表达式并从!
更改为tuple(sequence)
。谢谢你们。
。this link Retired Ninja和optimized version David Foerster显示的P.S.2。汇编代码实际上是一样的!
答案 0 :(得分:10)
(A || B || C)
在逻辑上等于!(!A && !B && !C)
,您错过了内部!
。第二个表达式中的短路发生在!A
为false
时,或等效于A
为true
时。但是当A
为true
时,第一个表达式也会短路。换句话说,这两个表达式在短路方面表现相同。
正如退休忍者在评论中提到的那样,这两个表达式产生相同的汇编代码,因此它们之间根本没有区别,除了一个更难阅读。