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

emk*_*a86 10 java xor operator-precedence logical-operators kotlin

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

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

boolean valid = (a > 0 && b <= 0) || (a <= 0 && b > 0);
Run Code Online (Sandbox Code Playgroud)

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

boolean valid = a > 0 ^ b > 0;
Run Code Online (Sandbox Code Playgroud)

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

val valid = a > 0 xor b > 0;
Run Code Online (Sandbox Code Playgroud)

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

  1. a > 0 给出布尔值
  2. boolean xor b > 0首先评估为:boolean xor bb > 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 语言中的一个错误?

IR4*_*R42 15

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)
Run Code Online (Sandbox Code Playgroud)

  • 为什么“它的优先级应该低于关系运算符”?布尔代数中没有比较运算符。在 python 中,异或(按位)也比比较运算符具有更高的优先级 (2认同)
  • @DrawnRaccoon 因为它的方式与其他所有具有它的编程语言不同。 (2认同)
  • `xor` 不是运算符,是执行逻辑运算的函数:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-boolean/xor.html (2认同)