2016-10-04 4 views
2

Пожалуйста, посмотрите на следующий код:Рабочая короткого замыкания и унарный

int i=5; 
boolean b = i<5 && ++i<5;//line 2 
System.out.println(i);//line 3, prints 5 

В строке 2, по моему пониманию: Так как среди всех операторов, ++ имеет наивысший приоритет ++i должны быть оценены первый. Но line 3 на самом деле печатает i=5 (и не 6). Значение, & & оценил оператор ++. Как это возможно?

EDIT: Из ответов я вижу, что «на Java все выражения оцениваются слева направо». Но когда на самом деле начинается порядок приоритета. В следующем коде:

int a=1,b=1,c=1; 
boolean b = a==b&&b==c;//Line2 

Код строки2 будет просто запускаться слева направо. Сначала a == b оценивается тогда b == c, а затем & & оператор. Не могли бы вы объяснить больше?

+3

выражения оцениваются слева направо - только тогда приоритет оператора используется для группировки «подрезультатов». – assylias

+0

Не путайте приоритет оператора с порядком оценки. Это разные вещи. –

+0

Кстати, порядок оценки не только вступает в игру с операторами короткого замыкания, но и с другими. Рассмотрим 'int n = 5; System.out.println (++ n + --n * 1000); ' –

ответ

7

Это не то, как выражение обрабатывается.

В Java, все выражения оцениваются слева направо. Приоритет оператора входит в игру только при оценке аргументов от &&.

Так что i < 5 рассчитано до ++i < 5.

В этом случае ++i < 5будетне быть оценена, поскольку i < 5 является false. Таким образом, i остается на 5.

+0

Привет. Я только что редактировал. Не могли бы вы также ответить на это. Благодаря! – SKG

+0

Поскольку это принципиально новый вопрос, вы должны спросить его как таковой и отменить редактирование вопроса. (В противном случае вы аннулируете все текущие ответы.) Я буду искать его. – Bathsheba

1

Ключ: ++ имеет наивысший приоритет внутри выражения, но предложение boolean b = i<5 && ++i<5 имеет два выражения, оцененные слева направо.

Придумайте b = i<5 && ++i<5 как:

if(i<5){ 
    if (++i<5){ 
    return true; 
    } 
} 
+0

Привет. Я только что редактировал. Не могли бы вы также ответить на это. Благодаря! – SKG

0

Ваше непонимание в том, как работает '& &'. Когда вы используете их, java использует короткое замыкание или ленивую оценку.

boolean equal = 1==1 && 1==2 Java оценивает 1==1 видит это как true, проверяет амперсандов и должен оценить 1==2 который false и поэтому equal является false.

boolean equal = 1==2 && 1==1 Java оценивает 1==2 видит это как ложь, а затем проверяет амперсандов и может видеть, что ли следующее выражение истинно или ложно, результат тот же, что equal является false. Поэтому он никогда не оценивает второе уравнение.

Проще говоря, второй пример - boolean equal = false & true. Это может быть справедливо только в том случае, если оба являются истинными. Таким образом, знание первого ложно - это все, что нам нужно знать об исходе.Путем игнорирования выражения sencond в этот момент мы можем сэкономить ненужные вычисления.

0

Учитывая ваш отредактированный ответ, второй фрагмент кода также оценивается слева направо.

В обоих случаях есть выражение вида A && B с A в качестве левого аргумента и B в качестве правого аргумента &&.

Здесь применяется «слева направо». Сначала оценивается левое выражение A. В первом фрагменте кода, который является , и поскольку это выражение оценивается как false, второй аргумент этому даже не рассматривается, поскольку все выражение будет оцениваться как false (короткое замыкание).

В вашем втором фрагменте у вас есть аргумент слева a==b. Поскольку это оценивается как true, рассматривается только второй аргумент, который также вычисляется как true. Это оставляет вам true && true, который затем может быть обработан дальше.

+0

Я все еще не понимаю. Чувствуешь себя глупым. Что делает второй аргумент b == c? Почему я не могу использовать b && b == c как второй аргумент как : a == (b && b == c) или что-то подобное? Почему просто (a == b) && (b == c)? – SKG

+0

Это '(a == b) && (b == c)' из-за приоритета оператора Java. '==' имеет более высокий приоритет, чем '&&'. См. Здесь: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html – QBrute

Смежные вопросы