我是一名Java开发人员,有很多年的经验,最近在Kotlin中发现了一些非常惊奇的东西。在Java中,有一个很少使用的逻辑运算符^
XOR,但有时它很有用。例如:你可以轻松地检查两个数字中仅有一个大于零。
使用 &&
AND 运算符以及一些变量 a
和 b
,代码如下:
boolean valid = (a > 0 && b <= 0) || (a <= 0 && b > 0);
但可以轻松通过 ^
XOR 实现:
boolean valid = a > 0 ^ b > 0;
在 Kotlin 中,我们不使用 ^
作为 XOR,而是使用 xor
,同样的代码在 Kotlin 中看起来像这样:
val valid = a > 0 xor b > 0;
这里有一个问题,因为在Kotlin中,以下代码会导致编译错误!为什么?在Java中,所有逻辑运算符(&,&&,|,||,^
)的优先级都低于关系运算符(>, >=, <, <=, ==, !=
)。 在Koltin中也是一样的,但对于xor
似乎不是这样。 所以它是这样的:
a > 0
会给出布尔值boolean xor b > 0
首先评估为:boolean xor b
而不是b > 0
- 最后我们得到了编译错误,提示:
整数字面值不符合预期的类型布尔值
您可以在此处检查此情况:XOR not working well
有一个额外的情况:如果您认为这个方程式:a > 0 xor (b > 0)
有效...好吧,没有。另一个编译错误:类型不匹配:推断类型为布尔类型,但预期为整型
有人能解释一下这种逻辑的目的是什么,还是它只是Kotlin语言中的一个错误?