Логический оператор Java и / или приоритет - PullRequest
0 голосов
/ 13 марта 2019

Итак, куда бы я ни посмотрел, сначала написано, что &&, а затем || оценивается вторым. Так что либо я делаю что-то не так, либо это неправильно. Вот код:

static boolean foo(boolean b, int id){ System.out.println(id); return b;}

static{ System.out.println(foo(true, 3) && foo(true, 1) || foo(false, 2)) }
//returns 3 1

static{ System.out.println(foo(true, 2) || foo(true, 3) && foo(true, 1)} 
//returns 2

В первом статическом блоке && идет первым, короткое замыкание и игнорирует || но во втором статическом блоке, который является просто обратным, || идет первым и игнорирует &&. Это показывает слева направо, но в соответствии с документом Java, && имеет более высокий приоритет, что означает, что && всегда должно идти первым.

1 Ответ

0 голосов
/ 13 марта 2019

Более высокий приоритет && означает, что

foo(true, 2) || foo(true, 3) && foo(true, 1)

- это то же самое, что и

foo(true, 2) || (foo(true, 3) && foo(true, 1))

, но не

(foo(true, 2) || foo(true, 3)) && foo(true, 1)

Ничего другого.Это ничего не значит о порядке оценки.

Теперь для большинства операторов оценка x op y требует оценки как x, так и y.Если бы || был одним из них, он был бы таким же, как (return от оценки ||, а не от всего метода)

boolean tmp1 = foo(true, 2);
boolean tmp2 = foo(true, 3) && foo(true, 1);
return tmp1 || tmp2;

и && действительно "пошли бы первым».Но есть три оператора, которые не работают так: &&, || и ?:.Вместо этого вы получите

boolean tmp1 = foo(true, 2);
if (tmp1) {
    return true; 
} else {
    return foo(true, 3) && foo(true, 1);
}
...