我正在开发Java,我正在使用它IntelliJ作为我的 IDE。我写了一个if声明如下。if( list1.size() >= 1 || list2.contains(itemX) ) { //do something}IntelliJ建议转换 ( DeMorgan's Law) 并将其转换为:if( ! ( list1.size() < 1 && !( list2.contains(itemX) ) ) ) { //do something}所以它应用了一种非常普遍的离散数学理论来简化布尔表达式。我想知道的是这如何优化任何东西?||如果第一部分本身为真,运算符无论如何不会执行整个条件,并且仅当第一部分为假时才执行 RHS。转化后的条件是否有效?如何?
2 回答
江户川乱折腾
TA贡献1851条经验 获得超5个赞
这有点主观,但一个好的一般经验法则是尽可能多地消除复杂性。所谓复杂性,是指您需要执行多少操作才能获得所需的结果。
从这个意义上说,!a && !b
这比!(a || b)
因为在一种情况下你否定 a 和 b,然后执行 OR 和运算符导致 3 个操作,而在后一种情况下,你只执行 2 个操作。当然这是空洞的,当你'我们谈论的是两种情况,但是当你处理很多情况时,这会产生很大的不同。
但是在您的场景中,您的 IDE 更改它没有任何意义,因为后者的操作数量较少。可能是 IDE 试图拼命吸引你 :)
希望这是有道理的!
莫回无
TA贡献1865条经验 获得超7个赞
两者都是完全相同的陈述。
我同意如果第一部分为真,则 OR 运算符不会评估第二部分,但是,如果第一部分为假,AND 运算符也不会评估第二部分。
事实上,与 A||B 相比,评估 ~(~A && ~B) 将花费更多的时间和空间。
希望这可以帮助 :)
添加回答
举报
0/150
提交
取消