我已经成为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,而只是使用xor
,并且Kotlin中的相同代码看起来像这样:
val valid = a > 0 xor b > 0;
这里会出现问题,因为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语言中的错误?
[xor
是一个中缀函数,val valid = a > 0 xor b > 0
与]相同>
val valid = a > 0.xor(b) > 0
或val valid = a > (0 xor b) > 0
正确的版本:
val valid = (a > 0) xor (b > 0)