web-dev-qa-db-ja.com

XOR Kotlinの演算子は機能ですか、バグですか?

私は長年Java開発者でしたが、最近Kotlinで非常に驚くべきものを見つけました。Javaには、めったに使用されない論理演算子^があります[〜#〜] xor [〜#〜]が便利な場合があります。たとえば、2つの数値のうち1つだけがゼロより大きい。

&&[〜#〜] 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には似ていないため、次のようになります。

  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がうまく機能していません

もう1つのケース:これが機能すると思われる場合:a > 0 xor (b > 0)が機能します...まあ、違います。別のコンパイルエラー:Type mismatch: inferred type is Boolean but Int was expected

そのようなロジックの目的はあるのか、それともKotlin言語の単なるバグなのか、誰かが私に説明できますか?

7
emka86

kotlinのxor(中置関数であること-- docs )は、算術演算子(*、/、%、+、-)よりも優先順位が低く、Comparison(<、>、<=、 > =)、Equality(==、!==)&代入(=、+ =、-=、* =、/ =、%=)演算子(優先順位については、完全なリファレンスを確認してください here )。

1
triyambkam