2

我正在开发JavaIntelliJ用作我的 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。

转化条件有效吗?如何?

4

2 回答 2

5

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

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

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

希望这是有道理的!

于 2019-08-02T06:29:15.233 回答
4

两者都是完全相同的陈述。

我同意如果第一部分为 TRUE,OR 运算符不会评估第二部分,但是,如果第一部分为 FALSE,AND 运算符不会评估第二部分也是正确的。

事实上,与 A||B 相比,评估 ~(~A && ~B) 将花费更多时间和空间。

希望这可以帮助 :)

于 2019-08-02T06:26:51.357 回答