emk*_*a86 10 java xor operator-precedence logical-operators kotlin
我做 Java 开发人员已经很多年了,最近我在 Kotlin 中发现了一些非常令人惊讶的东西。在 Java 中有一个很少使用的逻辑运算符^
XOR,但有时它很有用。例如:您可以轻松检查两个数字中是否只有一个大于零。
使用&&
AND运算符和一些变量a
,b
它看起来像这样:
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
. 所以它是这样的:
a > 0
给出布尔值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 语言中的一个错误?
IR4*_*R42 15
xor
不是运算符,而是中
缀函数。中缀函数调用的优先级高于比较。表达式
val valid = a > 0 xor b > 0
是相同的 val valid = a > (0 xor b) > 0
(0 xor b)
给出 Int 值a > (0 xor b)
给出布尔值(step 2 Boolean result) > 0
)之间的比较,但是你不能比较Boolean和Int正确版本:
val valid = (a > 0) xor (b > 0)
Run Code Online (Sandbox Code Playgroud)