当你尝试做这样的事情:
if (true ^ 1) { //do something }
编译器合理地说,^
没有为参数类型boolean和int定义运算符.但如果你像这样使用它:
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.
我不会写这样的代码,请注意.我会惊讶地发现一个无法以不同方式更清楚地写出的例子.
因为操作>
具有比^
其更高的优先级,所以它相当于以true ^ (1>0)
相同类型操作(boolean ^ boolean).
1是int类型.
1> 0的类型为boolean.
^表示异或; 你不能XOR布尔和int.
换句话说:第一个表达式"1"计算为一个数字; 第二个表达式"1> 0"计算为布尔逻辑.其背后的原因是运营商的先天性.