在这个编码技巧实践中http://codingbat.com/prob/p181646
为什么我放:
return (aSmile && bSmile) || !(aSmile && bSmile);
给定实践的答案是错误的,而如果我提出的话
return (aSmile && bSmile) || (!aSmile && !bSmile);
答案是正确的,!(aSmile && bSmile)与(!aSmile &&!bSmile)或其他导致我的第一个答案错误的东西之间有什么区别吗?
答案 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