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

Pav*_*vel 29 java syntax

当你尝试做这样的事情:

if (true ^ 1) {
  //do something
}
Run Code Online (Sandbox Code Playgroud)

编译器合理地说,^没有为参数类型boolean和int定义运算符.但如果你像这样使用它:

if (true ^ 1 > 0) {
  //do something
}
Run Code Online (Sandbox Code Playgroud)

代码编译(至少Java 8)并且完美无缺.基本上这些操作:

false ^ -1 > 0 
false ^ 1 > 0
true ^ -1 > 0
true ^ 1 > 0
Run Code Online (Sandbox Code Playgroud)

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

     | ^
-----+--
 F F | F
 F T | T
 T F | T
 T T | F
Run Code Online (Sandbox Code Playgroud)

请问有什么人可以解释引擎盖下发生的事情吗?

Jon*_*eet 78

原因很简单:>具有较高的优先级^,所以

if (true ^ 1 > 0) {
Run Code Online (Sandbox Code Playgroud)

相当于

if (true ^ (1 > 0)) {
Run Code Online (Sandbox Code Playgroud)

这相当于

if (true ^ true)
Run Code Online (Sandbox Code Playgroud)

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

我不会写这样的代码,请注意.我会惊讶地发现一个无法以不同方式更清楚地写出的例子.

  • 我从来没有理解为什么像Java和C#这样的安全导向语言甚至允许这样的代码,而不是为了清晰起见而需要括号.毕竟,没有规则要求运算符优先级必须是总顺序. (3认同)
  • @CodesInChaos我认为答案是'安全'导向而不是'清晰'导向.这些是相关但不同的.安全性要求没有歧义,这绝对是明确的.然而,以清晰为导向的语言的想法很有趣.我从来没有使用限制语法_purely_的东西,因为它可能很难理解.这有点奇怪,因为清晰度被广泛认为是良好发展的一个基本方面. (3认同)
  • @JonSkeet:我相信CodesInChaos的意思是"总命令"是Java不需要将`^`或`>`定义为具有更高的优先级.可以定义语言,使得在没有括号的同一表达式中使用两者将是解析错误.例如,Haskell允许以这种方式定义运算符:它会在同一个中缀表达式中说"优先解析错误:不能混合'^'[中缀5]和'>'[中缀5]." (3认同)
  • @CodesInChaos:well predence + associativity使得任何表达式都能很好地定义行为.我不确定这是不是"总订单"的意思...... (2认同)

And*_*niy 11

因为操作>具有比^其更高的优先级,所以它相当于以true ^ (1>0)相同类型操作(boolean ^ boolean).


Gho*_*ica 10

1是int类型.

1> 0的类型为boolean.

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

换句话说:第一个表达式"1"计算为一个数字; 第二个表达式"1> 0"计算为布尔逻辑.其背后的原因是运营商的先天性.