Kotlin 中的 XOR 运算符是功能还是错误?
Is XOR operator in Kotlin a feature or a bug?
我已经 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
不是运算符,而是一个
infix function. Infix function calls have higher precedence than the comparison. Expressions
val valid = a > 0 xor b > 0
等同于 val valid = a > (0 xor b) > 0
(0 xor b)
给出Int值
a > (0 xor b)
给出布尔值
- 变成了Boolean和Int的比较(
(step 2 Boolean result) > 0
),但是你不能把Boolean和Int比较
正确版本:
val valid = (a > 0) xor (b > 0)
xor(作为一个中缀函数-docs) in Kotlin has lower precedence than the arithmetic operators(*, /, %,+, -) and has higher precedence than Comparison(<, >, <=, >=),Equality(==, !==) & Assignment(=, +=, -=, *=, /=, %=) operators.(check for full reference for precedence here)。
我已经 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
不是运算符,而是一个
infix function. Infix function calls have higher precedence than the comparison. Expressions
val valid = a > 0 xor b > 0
等同于 val valid = a > (0 xor b) > 0
(0 xor b)
给出Int值a > (0 xor b)
给出布尔值- 变成了Boolean和Int的比较(
(step 2 Boolean result) > 0
),但是你不能把Boolean和Int比较
正确版本:
val valid = (a > 0) xor (b > 0)
xor(作为一个中缀函数-docs) in Kotlin has lower precedence than the arithmetic operators(*, /, %,+, -) and has higher precedence than Comparison(<, >, <=, >=),Equality(==, !==) & Assignment(=, +=, -=, *=, /=, %=) operators.(check for full reference for precedence here)。