多布尔值评估中&&与||效率对比及德摩根表达式效率疑问
好问题!这其实涉及到编程语言里的**短路求值(Short-circuit evaluation)**核心特性,咱们一步步拆解来看:
1. 多布尔值评估场景下,&& 是否比 || 更高效?
答案是没有绝对的谁更高效,完全取决于你的条件分布和逻辑需求:
&&(逻辑与)的短路规则:只要遇到一个false,就立即停止后续条件的评估,直接返回false。如果你的条件链里,大概率前几项就会出现false,那&&会快速结束评估。||(逻辑或)的短路规则:只要遇到一个true,就立即停止后续条件的评估,直接返回true。如果你的条件链里,大概率前几项就会出现true,那||的效率会更高。
举个实际例子:
- 要是判断
isUserLoggedIn && hasPermission && isAdmin,如果大多数用户都没登录,第一个条件isUserLoggedIn就会返回false,后面两个权限判断根本不会执行,这时候&&效率拉满。 - 要是判断
isGuest || hasTrialAccess || isPaidUser,如果大多数用户是访客,第一个条件isGuest就返回true,后面两个也不会跑,这时候||更高效。
说白了,谁能更快触发短路,谁就更高效。
2. 德摩根等价式的效率对比:(A || B || C) vs !(!A && !B && !C),当!A为假时(即A为真),谁更高效?程序会提前终止评估吗?
先给结论:两种写法都会提前终止后续条件的评估,但前者(A || B || C)效率更高。
咱们拆解当A为真时的执行流程:
对于
A || B || C:- 评估
A,结果为true。 - 触发
||的短路规则,直接返回true,完全不会再评估B和C。
整个过程只做了一次布尔判断,没有额外的取反操作。
- 评估
对于
!(!A && !B && !C):- 先计算
!A,结果为false(因为A是真)。 - 触发
&&的短路规则:左操作数已经是false,不管!B和!C是什么,整个&&表达式的结果都是false,所以不会再评估!B和!C。 - 最后对
false取反,得到true。
整个过程多了两次取反操作(!A和最终的外层!),步骤比前者多。
- 先计算
另外提一句:除了效率,可读性也是关键——A || B || C比!(!A && !B && !C)直观太多,除非有特殊场景必须用后者,否则优先写前者。
内容的提问来源于stack exchange,提问作者ctanakul
相关产品推荐
相关产品推荐

