当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么(boolean^int>0)有效?》经验,为你挑选了3个好方法。

当你尝试做这样的事情:

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

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



1> Jon Skeet..:

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

if (true ^ 1 > 0) {

相当于

if (true ^ (1 > 0)) {

这相当于

if (true ^ true)

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

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


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

2> Andremoniy..:

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



3> GhostCat say..:

1是int类型.

1> 0的类型为boolean.

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

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

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有