在编程中 !(~A && ~B) 比 (A||B) 好吗?

我正在开发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。


转化后的条件是否有效?如何?


茅侃侃
浏览 156回答 2
2回答

江户川乱折腾

这有点主观,但一个好的一般经验法则是尽可能多地消除复杂性。所谓复杂性,是指您需要执行多少操作才能获得所需的结果。从这个意义上说,!a && !b这比!(a || b)因为在一种情况下你否定 a 和 b,然后执行 OR 和运算符导致 3 个操作,而在后一种情况下,你只执行 2 个操作。当然这是空洞的,当你'我们谈论的是两种情况,但是当你处理很多情况时,这会产生很大的不同。但是在您的场景中,您的 IDE 更改它没有任何意义,因为后者的操作数量较少。可能是 IDE 试图拼命吸引你 :)希望这是有道理的!

莫回无

两者都是完全相同的陈述。我同意如果第一部分为真,则 OR 运算符不会评估第二部分,但是,如果第一部分为假,AND 运算符也不会评估第二部分。事实上,与 A||B 相比,评估 ~(~A && ~B) 将花费更多的时间和空间。希望这可以帮助 :)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java