java - Kotlin 中的 XOR 运算符是功能还是错误?

标签 java kotlin logical-operators operator-precedence xor

我从事 Java 开发人员多年,最近我在 Kotlin 中发现了一些非常令人惊讶的东西。 Java中有一个很少使用的逻辑运算符^ 异或但有时它很有用。例如:您可以轻松检查两个数字中是否只有一个大于零。

&& AND 运算符和一些变量 ab它看起来像这样:

boolean valid = (a > 0 && b <= 0) || (a <= 0 && b > 0);

但是可以通过 ^ 轻松实现异或:

boolean valid = a > 0 ^ b > 0;

现在,在 Kotline 中我们不使用 ^作为XOR,但只是 xor Kotlin 中的相同代码如下所示:

val valid = a > 0 xor b > 0;

这里出现了一个问题,因为 Kotline 中的这段代码给出了......编译错误!为什么?因为在 Java 中,所有逻辑运算符 ( &,&&,|,||,^ ) 的优先级都低于关系运算符 ( >, >=, <, <=, ==, != )。在 Koltin 中也是如此,但看起来不适用于 xor 。所以事情是这样的:

  1. a > 0给出 boolean 值
  2. boolean xor b > 0首先评估为:boolean xor b不是b > 0
  3. 最后我们得到了编译错误:The integer literal does not conform to the expected type Boolean

您可以在这里查看此情况:XOR not working well

另一种情况:如果您认为是这样: a > 0 xor (b > 0)有效...好吧,不。另一个编译错误:Type mismatch: inferred type is Boolean but Int was expected

谁能解释一下这样的逻辑是否有某种目的,或者它只是 Kotlin 语言中的一个错误?

最佳答案

xor 不是一个运算符,而是一个 infix功能。中缀函数调用的优先级高于比较函数。 Expressions

val valid = a > 0 xor b > 0val valid = a > (0 xor b) > 0

  1. (0 xor b) 给出 Int 值
  2. a > (0 xor b) 给出 boolean 值
  3. 它变成了 Boolean 和 Int 之间的比较((step 2 Boolean result) > 0),但是你不能比较 Boolean 和 Int

正确版本:

val valid = (a > 0) xor (b > 0)

关于java - Kotlin 中的 XOR 运算符是功能还是错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60033933/

相关文章:

java - Java 中受密码保护的记事本问题

java - hibernate 映射 - 运行 hibernate 配置时出现错误

android - 为什么 Epoxy recyclerview 不在 kotlin 中生成自定义模型类

android - 将 Dagger 模块类中的静态方法转换为 Kotlin

android - 无法修复错误 : Cannot find symbol class ActivityMainBindingImpl

c - 多重逻辑运算符 || C 中 for 循环中的 (OR) 条件

java - 逻辑或在 while 循环中无法正常工作

java - 规则 "-fx-text-alignment"不起作用?

javascript - 逻辑或代替三元

java - 尝试通过按 Enter 键将 EditText 的内容添加到 ListView