Почему работает (boolean ^ int> 0)?
Когда вы пытаетесь сделать что-то вроде этого:
if (true ^ 1) {
//do something
}
компилятор разумно говорит, что оператор ^
не определен для типов аргументов boolean и int.
Но если вы используете его так:
if (true ^ 1 > 0) {
//do something
}
код компилирует (по крайней мере, для Java 8) и безупречно работает.
В основном эти операции:
false ^ -1 > 0
false ^ 1 > 0
true ^ -1 > 0
true ^ 1 > 0
Действуйте как действительный логический XOR:
| ^
-----+--
F F | F
F T | T
T F | T
T T | F
Может кто-нибудь объяснить, что происходит под капотом?
Ответы
Ответ 1
Это просто: >
имеет более высокий приоритет, чем ^
, поэтому
if (true ^ 1 > 0) {
эквивалентно
if (true ^ (1 > 0)) {
что эквивалентно
if (true ^ true)
... который является просто логическим XOR.
Я бы никогда не написал такой код, заметьте. Я был бы удивлен, увидев пример, который нельзя было бы написать более четко по-другому.
Ответ 2
Поскольку операция >
имеет более высокий приоритет, чем ^
, поэтому она эквивалентна true ^ (1>0)
, которая работает с одинаковыми типами (boolean ^ boolean).
Ответ 3
1 имеет тип int.
1 > 0 имеет тип boolean.
^ означает XOR; и вы не можете использовать XOR boolean и int.
Другими словами: первое выражение "1" оценивается числом; второе выражение "1 > 0" оценивается логической логикой. Причиной этого является оператор predecence.
Ответ 4
Поскольку порядок (приоритет) операций важен, >
имеет более высокий приоритет, чем ^
Здесь сначала проверяем 1 > 0
, а затем первая операция XORed (^
) с первым результатом
Является эквивалентным if(true ^ (1 > 0 ))
Но, конечно, вы не можете XORed логическим с int