我正试图确定以下表达式(其中a
和b
是正确声明的布尔变量(计算为false
:的条件
(a && (b || !a)) == a && b
对我来说,这个表达似乎永远都是正确的。如果a
或b
中的任何一个是false
,则等式运算符的两边都将求值为false
。如果a
和b
都为真,那么双方都将评估为真。这就是所有的选项,这是我在线作业的正确答案。然而,当我在带有Java 11 JVM的IntelliJ CE中运行此程序时,每当b
为false时,它似乎都会打印false:当a和b都为假时,IntelliJ输出假
当b为false,a为true时,我得到相同的输出。有人能解释一下我逻辑的错误在哪里吗?非常感谢。
我认为==
操作优先于&&
试试这个-
(a && (b || !a)) == (a && b)
您的代码应该是:
boolean c = (a && (b || !a)) == (a && b);
否则评估为:
boolean c = ((a && (b || !a)) == a) && b;
布尔运算具有等效的数学运算(这是CPU最终要做的(。你可以使用这个方法来检查任何方程,以确保它是按照你的预期得出的。它可以帮助您快速查看布尔逻辑是否适用于所有情况。
使用你的方程式这里是一个例子:
替换";真";其中1和";false";具有0。替换&;带*(如乘法(和||带+(如加法(!做你期望的事。然后检查相等性所以
a*(b+!a) == a*b
然后当a=false(0(和b=false(O(时,我们有
0*(0+1) == 0*0
or 0=0
这是真的。
我们可以继续使用其他选项进行检查。
a=1,b=1
1*(1+0) == 1*1
or 1=1
再说一遍,真正的
a=1,b=0
1*(0+1) == 1*0
1*1=0?
不正确(错误(。
通过最后一次测试,我们可以看到这个方程并不总是正确的。就像在数学中一样,布尔运算有一个运算顺序(正如许多其他人所提到的(,但我喜欢使用这种方法来确保我的方程按预期工作。