当您尝试执行以下操作时:
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
有人可以解释一下幕后会发生什么吗?
答案 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
对布尔进行异或