我在代码中看到了逻辑和比较操作,我觉得它可以简化。
简单地说,它看起来像:
if (!a || !(b || c)) {...}
但我认为它与
相同if (!a || !b || !c) {...}
在这种情况下我该怎么做?我想我可以在我必须处理的现有代码中看到更多这样的操作。除了手动检查之外,是否有规则来简化/优化此类操作?
答案 0 :(得分:1)
您可以应用DeMorgan's law获取:
if (!a || (!b && !c)) {...}
由于&&
的优先级高于||
,因此与以下内容相同:
if (!a || !b && !c) {...}
然而,整个条件似乎非常消极,读取正面条件几乎总是更容易,也许它会更好地写成:
// This is the negation of your condition after applying DeMorgan's law
if ( a && (b || c) ) {
// return or throw error
}
... // What you would've done in the if statement
答案 1 :(得分:0)
问题是!(b || c)我们是否与!b ||相同!C。 试试一个简单的真值表:
b c !(b||c) !b||!c
0 0 1 1
0 1 0 1
1 0 0 1
1 1 0 0
所以他们不一样。
答案 2 :(得分:0)
作为接近这种类型的布尔重构的一般技术,如果你不相信自己构造真值表的能力,那么如何沿着这些方式编写一些代码:
for a in {true, false}
for b in {true, false}
for c in {true, false}
if (!a || !(b || c)) <> (!a || !b || !c)
then exit with message "Not equivalent"
end
end
end
if
条件当然可以替换为您要测试的两个表达式。