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



我做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,而只是使用 Kotlin 中的xor和相同的代码如下所示:

val valid = a > 0 xor b > 0;

这里有一个问题,因为 Kotline 中的这段代码给出了......编译错误!!为什么?因为在Java中,所有逻辑运算符(&,&&,|,||,^(的优先级都低于关系运算符(>, >=, <, <=, ==, !=(。在科尔廷也一样,但看起来不适合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 无法正常工作

还有一个额外的情况:如果你认为这个:a > 0 xor (b > 0)有效......嗯,没有。另一个编译错误:Type mismatch: inferred type is Boolean but Int was expected

谁能解释一下这种逻辑是否有一些目的,或者它只是 Kotlin 语言中的一个错误?

xor不是运算符,而是 中缀功能。中缀函数调用的优先级高于比较。表达 式

val valid = a > 0 xor b > 0val valid = a > (0 xor b) > 0相同

  1. (0 xor b)给出 Int 值
  2. a > (0 xor b)给出布尔值
  3. 它变成了布尔值和 Int ((step 2 Boolean result) > 0( 之间的比较,但您无法将布尔值与 Int 进行比较

正确版本:

val valid = (a > 0) xor (b > 0)
Kotlin 中的

xor(作为中缀函数文档(的优先级低于算术运算符(*、/、%、-(,并且优先级高于 Comparison(<,>, <=,>=(、Equality(==, !==( & Assignment(=, +=, -=, *=,/=, %=( 运算符。在此处查看优先级的完整参考(。

相关内容

  • 没有找到相关文章

最新更新