在编程中 !(~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 拼命追求你:)
希望这是有道理的!!
我在 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 拼命追求你:)
希望这是有道理的!!