双重结构相等运算符:if(a == b == 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);

}

}

}

}

}

}

Got a==b==c with 0 0 0

Got a==b==c with 0 1 1

Got a==b==c with 1 0 1

Got a==b==c with 1 1 0

玩耍时,我注意到我if(a==b==c)除了不能使用任何类型boolean。从这个布尔表达式是

( A'. B'. C') + ( A'. B . C ) + ( A . B'. C ) + ( A . B . C')

简化为(A=B).'C + (A<>B).C

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

谁能解释该if(a==b==c)语法如何暗示这一点?

在许多人解释了左联想性之后,我发现我的困惑在哪里。通常,我将“ 1”表示为true,将“

0”表示为false,但是在上述测试中,我最小化的真值表/输出中,我将“ 0”表示为true,将“ 1”表示为false。表达式的取反( A'. B'.

C') + ( A'. B . C ) + ( A . B'. C ) + ( A . B . C')(A=B)=C

回答:

随便玩耍,我注意到除了布尔值以外,我不能使用任何类型的if(a == b == c)。

您不能使用任何类型来执行此操作,但是boolean因为此比较链将从左侧到右侧进行评估。第一个比较将简化为truefalse必须与链中的第三个值进行比较的值(并且此检查的结果将与第四个值进行比较,依此类推,直到链的末尾)。至于原始值,您只能比较相同类型的原始值(例如boolean和boolean将起作用,而double和boolean将不起作用)-这就是为什么只能使用booleans的原因-

因为==返回的是相同的值输入为链中所有值。

这里存在危险:所有比较链的结果都不等于true您提供的所有值都等于时true。您可以从第二个输出中看到它:true== false==

false提高了true,如果您从左到右评估它(在程序执行过程中发生),这是正确的结果,但是如果 您认为 必须同时评估这个比较链,这

似乎是错误的 。正确的方法是两个执行两个显式比较: __

if (a == b && b == c) {

// do something

}

以上是 双重结构相等运算符:if(a == b == c) 的全部内容, 来源链接: utcz.com/qa/422076.html

回到顶部