2014-08-28 2 views
4

&& должен иметь более высокий приоритет, чем ||:Приоритет Java булево

int a = 10; 
    System.out.println(a==10 || --a==9 && a==8); 
    System.out.println(a); 

печатается верно, и 10. Кажется, что он проверяет только первую часть, и если ее истинный второй никогда не выполняется.

Если я делаю a==9, то вторая часть, кажется, оценивает и печатает 9. Может ли кто-нибудь объяснить, почему это происходит? Разве не стоит &&?

Редактировать: Я вижу. a==10 || --a==9 && a==8 преобразуется в (a==10) || (a==9 && a==8) Итак, если первый оценивает true, это короткие замыкания. Спасибо вам за помощь.

+0

нет Более высокий приоритет, он просто идет слева направо .. – gtgaxiola

+0

@gtgaxiola Осторожно, когда вы не говорите о преимуществе. Если не было приоритета. Если бы не было приоритета, выражение выражало бы true. – Cruncher

+0

@Cruncher хороший catch .. – gtgaxiola

ответ

4
System.out.println(a==10 || --a==9 && a==8); 

равна

System.out.println((a==10) || (((--a)==9) && (a==8))); 

Java оценивает || первых. Узнайте, что левая часть (а == 10) является true и получаем, что не матер, что находится в правильном результате часть все равно будет true

PS: это обычная уловка, чтобы написать

if(obj != null && obj.isSomething) { ... } 

к предотвращение NPE

3

Если оценивать (a==10) || (b == 9) (который является OR операция), если первое условие является true, то все выражение должно быть true (потому что OR) и второе условие не будет выполнено по причинам оптимизации.

код выполняется слева направо, так что вы попали в первый TRUE поэтому ваш весь оператор будет TRUE, а остальная часть Вашего заявления не будет выполнена

Если ваш первый пункт является false, то только будет оценено второе предложение.

Если вы используете (a==10) | (b == 9), оба предложения будут оцениваться.

Если вы хотите быть уверены в приоритете ваших операторов, вы должны использовать скобки

2

Это не имеет ничего общего с более высоким приоритетом в этом случае. Посмотрите на ленивую оценку. Операция будет оцениваться слева направо и обнаружит, что значение a==10 истинно и останавливается.

Посмотрите на комментарии в http://introcs.cs.princeton.edu/java/11precedence/ по заказу оценки

3

Это полезно смотреть на выражения, как деревья.

a==10 || --a==9 && a==8 

В этом примере верхняя часть дерева является OR. Левая ветвь является EQUALS, а правая ветвь - AND, левая и правая ветви которой равны EQUALS.

Так как я ужасно на графике, это будет выглядеть примерно так:

OR 
/ \----- 
    =   \ 
/\   AND 
a 10  / \ 
      =  = 
     /\ /\ 
     --a 9 a 8 

The «старшинства», что вы говорите, это дерево заказов. Но это не обязательно изменяет порядок выполнения. Потому что в этом случае это верно, если первая ветвь истинна, поэтому нет необходимости проверять вторую ветвь.

0
|| and && are short circuit operators they don't evaluate the right hand side expression 
if the left hand side is true. 
So (--a) is never executed as (a==10) left hand side is true 
Therefore the value of a remains same. 
**& and | operators that always evaluate both sides. 
Смежные вопросы