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

Is !(~A && ~B) better than (A||B) in programming?

我在 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。

转换后的条件有效吗?怎么样?

两者是一模一样的说法。

我同意如果第一部分为真,则 OR 运算符不会计算第二部分,但是,如果第一部分为假,AND 运算符也不会计算第二部分。

事实上,与 A||B 相比,评估 ~(~A && ~B) 需要更多时间和 space。

希望对您有所帮助:)

这有点主观,但一个好的一般经验法则是尽可能多地消除复杂性。我所说的复杂性是指您需要执行多少操作才能获得所需的结果。

从这个意义上说,!a && !b!(a || b) 更糟糕,因为在一种情况下,您要否定 a 和 b,然后执行 OR 和运算符,导致 3 次运算,而在后一种情况下,你只执行 2。当然,当你谈论两个条件时,这是空洞的,但当你处理许多条件时,这会产生很大的不同。

但在您的场景中,您的 IDE 更改它没有任何意义,因为后者的操作次数较少。可能是 IDE 拼命追求你:)

希望这是有道理的!!