布尔!(aSmile && bSmile)和(!aSmile &&!bSmile)之间的区别

时间:2018-06-22 16:10:09

标签: java boolean

在这个编码技巧实践中http://codingbat.com/prob/p181646

为什么我放:

 return (aSmile && bSmile) || !(aSmile && bSmile);

给定实践的答案是错误的,而如果我提出的话

 return (aSmile && bSmile) || (!aSmile && !bSmile);

答案是正确的,!(aSmile && bSmile)与(!aSmile &&!bSmile)或其他导致我的第一个答案错误的东西之间有什么区别吗?

5 个答案:

答案 0 :(得分:7)

   A   |   B   | !(A && B) |
-------+-------+-----------|
  True |  True |   False   |
  True | False |   True    |
 False |  True |   True    |
 False | False |   True    |

   A   |   B   | !A || !B  |
-------+-------+-----------|
  True |  True |   False   |
  True | False |   True    |
 False |  True |   True    |
 False | False |   True    |

   A   |   B   | !A && !B  |
-------+-------+-----------|
  True |  True |   False   |
  True | False |   False   |
 False |  True |   False   |
 False | False |   True    |

!(A && B)等于!A || !B,所以
!(A && B)!A && !B不是同一个人

答案 1 :(得分:2)

!(aSmile && bSmile)

应该是:

!aSmile || !bSmile

答案 2 :(得分:2)

这里唯一的区别是第二个操作数之间:

!(aSmile && bSmile)

(!aSmile && !bSmile)

de Morgan's Laws是一些有用的定律,它们说第一个等效于:

(!aSmile || !bSmile)

第二个等效于:

!(aSmile || bSmile)

考虑到这些定律,希望您能明白为什么这两种表达方式不同!

答案 3 :(得分:1)

!(True && False) == !(False) == True
(!True && !False) == (False && True) == False 

在这里我们可以清楚地看到为什么这两个语句之间存在差异。

答案 4 :(得分:0)

(aSmile && bSmile) || !(aSmile && bSmile)

这将永远是正确的。如果您对此进行分析,您将明白原因。 (aSmile && bSmile)可以为true或false。如果为真,则整个表达式为真。如果为假,则!(aSmile && bSmile)为真,再次使整个表达式为真。

换句话说,左边的意思是“他们都在微笑”,右边的意思是“他们不是都在微笑(其中一个是,或者都不是)”

(aSmile && bSmile) || (!aSmile && !bSmile)

因此,当(aSmile && bSmile)为假时,(!aSmile && !bSmile)也可能为假。左侧表示“他们都在微笑”,右侧表示“他们都没有在微笑(都不是)”。当其中只有一个微笑时,该表达式将为false。

您的布尔表达式可以简化为:

aSmile == bSmile