Подтвердить что ты не робот

Почему работает (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

Может кто-нибудь объяснить, что происходит под капотом?

4b9b3361

Ответ 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