Java 双结构相等运算符:if(a==b==c)

Java 双结构相等运算符:if(a==b==c),java,Java,今天我无意中写了一些代码,当Eclipse第一次没有对我大喊大叫时,我感到很惊讶。代码双重使用了结构相等运算符(=),类似于下面的if(a==b==c)结构 public class tripleEqual { public static void main(String[] args) { boolean[] a = { true, false }; boolean[] b = { true, false }; boolean[] c =

今天我无意中写了一些代码,当Eclipse第一次没有对我大喊大叫时,我感到很惊讶。代码双重使用了结构相等运算符(
=
),类似于下面的
if(a==b==c)
结构

public class tripleEqual {
    public static void main(String[] args) {
        boolean[] a = { true, false };
        boolean[] b = { true, false };
        boolean[] c = { true, false };

        for (int aDex = 0; aDex < 2; aDex++) {
            for (int bDex = 0; bDex < 2; bDex++) {
                for (int cDex = 0; cDex < 2; cDex++) {
                    if (a[aDex] == b[bDex] == c[cDex]) {
                        System.out.printf("Got a==b==c with %d %d %d\n", aDex, bDex, cDex);
                    }
                }
            }
        }

    }
}
在玩游戏时,我注意到除了布尔型之外,如果(a==b==c)使用任何类型,我都无法执行
if(a==b==c)
。因此,布尔表达式为

( A'. B'. C') + ( A'. B . C ) + ( A . B'. C ) + ( A . B . C') 
它简化为
(A=B)。'C+(AB).C

因此,忽略副作用,
if(a==b==c)
等于
if(a==b&&c)|(a!=b&&c))

有人能解释一下if(a==b==c)语法是如何表示的吗

编辑1:

在这么多人解释了左联想之后,我发现了我的困惑所在。通常我写'1'表示真,写'0'表示假,但是在上面的测试中,我最小化了真值表/输出,我用'0'表示真,用'1'表示假。表达式
(A.B.C')+(A.B.C)+(A.B.C)+(A.B.C)+(A.B.C')
的否定是
(A=B)=C

,因此
a==b==c
被解释为
(a==b)==c
。因此
a==b
返回一个bool,然后将其与
c
进行比较

这是解析器的一个副作用,在实践中很少有用。正如您所观察到的,它看起来只做了一件事,但做了一些非常不同的事情(因此,即使它做了您想要的事情,也不推荐它)。某些语言实际上使
==
运算符非关联,因此
a==b==c
是一个语法错误

我注意到,如果(a==b==c)使用除布尔之外的任何类型,我都做不到

除了
boolean
之外,您不能对任何类型执行此操作,因为此比较链将从左侧到右侧进行计算。第一次比较将简化为
true
false
值,该值必须与链中的第三个值进行比较(该检查的结果将与第四个值进行比较,依此类推,直到链的末尾)。至于原语值,您只能比较相同类型的原语(例如布尔值和布尔值有效,而双精度和布尔值无效)——这就是为什么您只能用布尔值进行比较——因为
==
返回与链中所有值相同类型的值。
这里存在危险:当您提供的所有值都是
true
时,所有比较链的结果都不等于
true
。您可以从第二个输出中看到它:
true
=
false
=
false
引发了
true
,如果您从左到右对其进行求值(就像在程序执行期间发生的那样),这是正确的结果,但如果您认为必须一次对该比较链求值,则可能看起来是错误的。正确的方法是执行两次显式比较:

if (a == b && b == c) {
    // do something
}

我想补充一点,这个构造可以使用三个布尔值,但可能没有达到OP的期望。例如,
true==false=/code>应该是
true
。一周前我已经回答了一个类似的问题(这个问题是关于JavaScript的,但规则是一样的):@John那些确实计算为false,所以我没有真正理解你所说的。然而,我要说的是,我所说的“与1+2+3相同的想法”是误导性的,因为整数上的
+
是关联的,布尔上的
==
不是(即((a+b)+c)等于(a+(b+c))等于整数,但是((a==b)==c)不等于(a==(b==c))布尔上的本哥斯布我确实明白我的困惑所在,在我的测试代码中,我的输出是0=true&1=false。这和我习惯的正好相反。否定(A=B)。'C+(AB).C确实给了我(A=B)=C。我用过if(A==B&&B==C),if(A==B==C)的使用是一个有趣的情况。我“知道”a==b==c!=(a==b&&b==c)但当我键入if(a==b==c)和Eclipse没有出错时,我就去调查了。
if (a == b && b == c) {
    // do something
}