首页 > 解决方案 > Kotlin 中的 XOR 运算符是功能还是错误?

问题描述

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

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

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

但它可以通过^ XOR轻松实现:

boolean valid = a > 0 ^ b > 0;

现在,在 Kotline 中,我们不用^XOR,但xor在 Kotlin 中相同的代码看起来像这样:

val valid = a > 0 xor b > 0;

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

  1. a > 0给出布尔值
  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 语言中的一个错误?

标签: javakotlinlogical-operatorsoperator-precedencexor

解决方案


xor不是运算符,而是中 函数。中缀函数调用的优先级高于比较。表达式

val valid = a > 0 xor b > 0是相同的val valid = a > (0 xor b) > 0

  1. (0 xor b)给出 Int 值
  2. a > (0 xor b)给出布尔值
  3. 它变成了 Boolean 和 Int ( (step 2 Boolean result) > 0) 之间的比较,但您不能将 Boolean 与 Int 进行比较

正确版本:

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

推荐阅读