我最近用Java进行了入门测试,这个问题让我感到困惑。 完整的问题是:
boolean b1 = true;
boolean b2 = false;
if (b2 != b1 != b2)
System.out.println("true");
else
System.out.println("false");
我的第一个问题是什么(b2!= b1!= b2)意味着,第二个问题,如标题中所指定的,是如何(false!= true!= false)评估为true而(true!= false! = true)评估为false(我在Netbeans上测试过)。
答案 0 :(得分:6)
您有两个布尔比较,其中第一个比较产生的结果与另一个布尔值(最后一个)进行比较。
并且等于运算符在语法上是左关联的(它们从左到右分组)。
要了解您可以通过两次比较来重写实际比较:
1)false != true != false
== true
为
boolean result = false != true; // ->true
result = true != false; // ->true
result == true;
2)true != false != true
== false
为
boolean result = true != false; // -> true
result = true != true; // -> false
result == false;
或者你也可以用括号括起第一个比较,以便于阅读评价优先顺序(从左到右):
1)false != true != false
== true
为
<=> (false != true) != false
<=> true != false
<=> true
2)true != false != true
== false
为
<=> (true != false) != true
<=> true != true
<=> false
答案 1 :(得分:0)
它将以这种方式评估:
1 - false != true != false
= false!=true
= true
因此false != true
成为true
,然后等式变为这样
true
!= false
等于true
所以结果是true
。
现在,对于第二个,您可以采用与
相同的方式进行评估 2- true != false != true
true!=false
,true
现在为true != true
false
,因此您的结果为false
答案 2 :(得分:0)
看看大多数编译器从左到右开始评估表达式会发生什么 所以在这种情况下,首先发生的是评估这一点。
False != True == True //is evaluated first which is true
然后用第一个表达式
得到的结果为真True != False == True //which is also true
所以完成者表达式就像这样
False != True != False == True// which is True
现在在第二种情况下,表达式就像
True != False != True == False
第一个表达式的输出是True!= False计算为True,表达式变为True!= True,这是假的
我希望这是有道理的。这是因为!=的关联性是从左到右,所以它从左到右进行评估。