[英]Why does (boolean ^ int > 0) work?
当你尝试做这样的事情:
if (true ^ 1) {
//do something
}
编译器合理地说,没有为参数类型boolean和int定义operator ^
。 但如果你像这样使用它:
if (true ^ 1 > 0) {
//do something
}
代码编译(至少Java 8)并且完美无缺。 基本上这些操作:
false ^ -1 > 0
false ^ 1 > 0
true ^ -1 > 0
true ^ 1 > 0
表现得像一个有效的逻辑异或:
| ^
-----+--
F F | F
F T | T
T F | T
T T | F
有人可以解释一下在引擎盖下发生了什么?
这很简单: >
优先级高于^
,所以
if (true ^ 1 > 0) {
相当于
if (true ^ (1 > 0)) {
这相当于
if (true ^ true)
......这只是逻辑XOR。
我不会写这样的代码,请注意。 我会惊讶地发现一个无法以不同方式更清楚地写出的例子。
因为operation >
具有比^
更高的优先级,所以它相当于使用相同类型(boolean ^ boolean)操作的true ^ (1>0)
)。
1是int类型。
1> 0的类型为boolean。
^表示异或; 你不能XOR布尔和int。
换句话说:第一个表达式“1”计算为一个数字; 第二个表达式“1> 0”计算为布尔逻辑。 其背后的原因是运营商的先天性 。
由于操作的顺序(优先级)很重要, >
优先级高于^
这里,首先我们检查1 > 0
然后第一个操作与第一个结果进行异或( ^
)
相当于if(true ^ (1 > 0 ))
但是,当然你不能用int对Xored进行异或
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.