我做Java开发人员已经很多年了,最近我在Kotlin中发现了一些非常令人惊讶的东西。在Java中,XOR^
有一个很少使用的逻辑运算符,但有时它很有用。例如:您可以轻松检查两个数字中的一个并且只有一个大于零。
使用&&
AND运算符和一些变量a
和b
,它看起来像这样:
boolean valid = (a > 0 && b <= 0) || (a <= 0 && b > 0);
但它可以通过^
XOR轻松实现:
boolean valid = a > 0 ^ b > 0;
现在,在 Kotline 中,我们不使用^
作为XOR,而只是使用 Kotlin 中的xor
和相同的代码如下所示:
val valid = a > 0 xor b > 0;
这里有一个问题,因为 Kotline 中的这段代码给出了......编译错误!!为什么?因为在Java中,所有逻辑运算符(&,&&,|,||,^
(的优先级都低于关系运算符(>, >=, <, <=, ==, !=
(。在科尔廷也一样,但看起来不适合xor
.所以它是这样的:
a > 0
给出布尔值boolean xor b > 0
首先证明:boolean xor b
不b > 0
- 最后我们得到编译错误,说:
The integer literal does not conform to the expected type Boolean
您可以在此处检查这种情况:XOR 无法正常工作
还有一个额外的情况:如果你认为这个:a > 0 xor (b > 0)
有效......嗯,没有。另一个编译错误:Type mismatch: inferred type is Boolean but Int was expected
谁能解释一下这种逻辑是否有一些目的,或者它只是 Kotlin 语言中的一个错误?
xor
不是运算符,而是 中缀功能。中缀函数调用的优先级高于比较。表达 式
val valid = a > 0 xor b > 0
与val valid = a > (0 xor b) > 0
相同
(0 xor b)
给出 Int 值a > (0 xor b)
给出布尔值- 它变成了布尔值和 Int (
(step 2 Boolean result) > 0
( 之间的比较,但您无法将布尔值与 Int 进行比较
正确版本:
val valid = (a > 0) xor (b > 0)
xor(作为中缀函数文档(的优先级低于算术运算符(*、/、%、-(,并且优先级高于 Comparison(<,>, <=,>=(、Equality(==, !==( & Assignment(=, +=, -=, *=,/=, %=( 运算符。在此处查看优先级的完整参考(。