为什么(boolean ^ int> 0)有效?

时间:2017-01-25 14:53:34

标签: java syntax

当您尝试执行以下操作时:

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

表现得像一个有效的逻辑XOR:

     | ^
-----+--
 F F | F
 F T | T
 T F | T
 T T | F

有人可以解释一下幕后会发生什么吗?

4 个答案:

答案 0 :(得分:78)

很简单:>的{​​{3}}高于^,所以

if (true ^ 1 > 0) {

相当于

if (true ^ (1 > 0)) {

相当于

if (true ^ true)

......这只是逻辑XOR。

我想永远不会这样的代码,请注意。我会惊讶地看到一个无法以不同方式更清晰地写出的例子。

答案 1 :(得分:11)

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

答案 2 :(得分:10)

1的类型为int。

1> 0的类型为boolean。

^表示异或;你不能XOR布尔和int。

换句话说:第一个表达式“1”计算为一个数字;第二个表达式“1> 0”计算为布尔逻辑。其背后的原因是运营商predecence

答案 3 :(得分:3)

由于操作的顺序(优先级)很重要,>的优先级高于^

在这里,首先我们检查1 > 0然后第一个操作与第一个结果进行异或(^

相当于if(true ^ (1 > 0 ))

但是,当然你不能用int

对布尔进行异或