Небольшие сомнения. Почему выводится следующий код 1
? Почему не 3
?Почему не выполняется оценка правой стороны оператора &&?
int i = 0;
boolean t = true, f = false, b;
b = (t && ((i++) == 0));
b = (f && ((i+=2) > 0));
System.out.println(i);
Небольшие сомнения. Почему выводится следующий код 1
? Почему не 3
?Почему не выполняется оценка правой стороны оператора &&?
int i = 0;
boolean t = true, f = false, b;
b = (t && ((i++) == 0));
b = (f && ((i+=2) > 0));
System.out.println(i);
Условный-И оператор - &&
- это короткое замыкание. Он не оценивает правый операнд, если левый операнд ложный. Вот почему ((i+=2) > 0)
никогда не оценивали, и i
остается 1.
От JLS 15.23:
& & оператор подобен & (§15.22.2), но оценивает ее правый операнд, только если значение его левого операнда истинно.
Вот случай
b = (f && ((i+=2) > 0)); // here f is false
Теперь false && anything
является false
. &&
является оператором короткого замыкания, поэтому он не будет оценивать ((i+=2)
часть с левого - false
. Так i
останется 1
Просто попробуйте изменить
b = (f && ((i+=2) > 0));
Для
b = (f & ((i+=2) > 0));// non short circuit
Теперь вы получите 3
.
Это два разных поведения short circuit
и non short circuit
AND
.
Подробнее info.
Большое спасибо ... – Leo
@Leo Добро пожаловать –
Согласен с ответом, как &&
несет ответственность за это.
Следует отметить здесь, что ваше заявление b = (t && ((i++) == 0));
эквивалентно
if(t){
if(i++==0){
b=true;
}
}
и второе утверждение b = (f && ((i+=2) > 0));
эквивалентно,
if(f==true){
i=i+2;
if(i>0){
b=true;
}
}
Например:
if(p && q){
// do something
}
если p
оценивается ed, чтобы быть ложным, остальная часть утверждения не должна оцениваться из-за самого определения &&
(p
И q
должно быть истинным). Если p
неверно, то утверждение не может быть правдой.
Вам не приходило в голову, что этот вопрос является дубликатом? – Raedwald
@ Raedwald У меня нет времени искать дубликаты вопросов, заданных другими людьми, поэтому я закрываю только дубликаты, если знаю конкретный вопрос, что это дубликат. В противном случае ответ часто требует гораздо меньше времени. – Eran