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

Is XOR operator in Kotlin a feature or a bug?

我已经 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 语言中的一个错误?

xor 不是运算符,而是一个 infix function. Infix function calls have higher precedence than the comparison. Expressions

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)

xor(作为一个中缀函数-docs) in Kotlin has lower precedence than the arithmetic operators(*, /, %,+, -) and has higher precedence than Comparison(<, >, <=, >=),Equality(==, !==) & Assignment(=, +=, -=, *=, /=, %=) operators.(check for full reference for precedence here)。