我从事 Java 开发人员多年,最近我在 Kotlin 中发现了一些非常令人惊讶的东西。 Java中有一个很少使用的逻辑运算符^
异或但有时它很有用。例如:您可以轻松检查两个数字中是否只有一个大于零。
与 &&
AND 运算符和一些变量 a
和b
它看起来像这样:
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
。所以事情是这样的:
-
a > 0
给出 boolean 值 -
boolean xor b > 0
首先评估为:boolean xor b
不是b > 0
- 最后我们得到了编译错误:
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 > 0
与 val valid = a > (0 xor b) > 0
(0 xor b)
给出 Int 值a > (0 xor b)
给出 boolean 值- 它变成了 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/