为什么 (布尔值 ^ int > 0) 有效?

2022-09-01 12:22:46

当您尝试执行类似操作时:

if (true ^ 1) {
  //do something
}

编译器合理地说,运算符不是为参数类型布尔值和 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

任何人都可以解释一下引擎盖下发生了什么吗?


答案 1

这很简单:具有比 更高的优先级,因此>^

if (true ^ 1 > 0) {

等效于

if (true ^ (1 > 0)) {

这相当于

if (true ^ true)

...这只是合乎逻辑的异或。

我永远不会这样的代码,介意你。我会惊讶地看到一个例子,它不能以不同的方式写得更清楚。


答案 2

因为操作的优先级高于 ,所以它等效于使用相同类型(布尔 ^ 布尔值)进行操作的操作。>^true ^ (1>0)