如何确保两个逻辑和比较操作相同?

时间:2016-04-28 08:00:22

标签: logic boolean-logic

我在代码中看到了逻辑和比较操作,我觉得它可以简化。

简单地说,它看起来像:

if (!a || !(b || c)) {...}

但我认为它与

相同
if (!a || !b || !c) {...}

在这种情况下我该怎么做?我想我可以在我必须处理的现有代码中看到更多这样的操作。除了手动检查之外,是否有规则来简化/优化此类操作?

3 个答案:

答案 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条件当然可以替换为您要测试的两个表达式。