双重结构相等运算符: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 0Got 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
因为此比较链将从左侧到右侧进行评估。第一个比较将简化为true
或false
必须与链中的第三个值进行比较的值(并且此检查的结果将与第四个值进行比较,依此类推,直到链的末尾)。至于原始值,您只能比较相同类型的原始值(例如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