Является ли оператор XOR в Kotlin функцией или ошибкой? - PullRequest
5 голосов
/ 03 февраля 2020

Я был 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 все логические операторы (&,&&,|,||,^) имеют меньший приоритет, чем реляционные операторы (>, >=, <, <=, ==, !=). То же самое в Колтине, но, похоже, не для xor. Таким образом, это происходит следующим образом:

  1. a > 0 дает логическое значение
  2. boolean xor b > 0, сначала оцененное как: boolean xor b not b > 0
  3. И наконец мы получил ошибку компиляции, которая сказала: The integer literal does not conform to the expected type Boolean

Вы можете проверить эту ситуацию здесь: XOR не работает хорошо

Один дополнительный случай: если вы думаете, что это: a > 0 xor (b > 0) работает ... ну, нет. Еще одна ошибка компиляции: Type mismatch: inferred type is Boolean but Int was expected

Может кто-нибудь объяснить мне, есть ли какая-то намека на такие логи c или это просто ошибка в Kotlin языке?

Ответы [ 2 ]

9 голосов
/ 03 февраля 2020

xor является функцией infix . Вызовы инфиксных функций имеют более высокий приоритет, чем сравнение. Выражения

val valid = a > 0 xor b > 0 совпадает с val valid = a > (0 xor b) > 0

  1. (0 xor b) дает значение Int
  2. a > (0 xor b) дает логическое значение
  3. и это превращается в сравнение между Boolean и Int ("step 2 Boolean result" > 0), но вы не можете сравнить Boolean с Int

Правильная версия:

val valid = (a > 0) xor (b > 0)
0 голосов
/ 03 февраля 2020

xor (будучи инфиксной функцией- docs ) в Kotlin имеет более низкий приоритет, чем арифметические c операторы (*, /,%, +, -), и имеет более высокий приоритет, чем Сравнение ( <,>, <=,> =), Операторы равенства (==,! ==) и присвоения (=, + =, - =, * =, / =,% =). (Проверьте наличие полной ссылки на приоритетность здесь ).

...