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

问题描述 投票:1回答:1

我已经成为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,而只是使用xor,并且Kotlin中的相同代码看起来像这样:

val valid = a > 0 xor b > 0;

这里会出现问题,因为Kotline中的这段代码给出了... 编译错误 !!为什么?因为在Java中,所有逻辑运算符(&,&&,|,||,^)的优先级都低于关系运算符(>, >=, <, <=, ==, !=)。在Koltin中也一样,但看起来不适合xor。所以它是这样的:

  1. [a > 0给出布尔值
  2. [boolean xor b > 0首先体现为:boolean xor b不是b > 0
  3. 最后,我们得到编译错误,内容为: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语言中的错误?

java kotlin logical-operators operator-precedence xor
1个回答
0
投票

[xor是一个中缀函数,val valid = a > 0 xor b > 0与]相同>

val valid = a > 0.xor(b) > 0val valid = a > (0 xor b) > 0

正确的版本:

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

infix-notation

© www.soinside.com 2019 - 2024. All rights reserved.