2014-10-20 2 views

ответ

6

Условный-И оператор - && - это короткое замыкание. Он не оценивает правый операнд, если левый операнд ложный. Вот почему ((i+=2) > 0) никогда не оценивали, и i остается 1.

От JLS 15.23:

& & оператор подобен & (§15.22.2), но оценивает ее правый операнд, только если значение его левого операнда истинно.

+0

Вам не приходило в голову, что этот вопрос является дубликатом? – Raedwald

+0

@ Raedwald У меня нет времени искать дубликаты вопросов, заданных другими людьми, поэтому я закрываю только дубликаты, если знаю конкретный вопрос, что это дубликат. В противном случае ответ часто требует гораздо меньше времени. – Eran

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 circuitAND.

Подробнее info.

+0

Большое спасибо ... – Leo

+0

@Leo Добро пожаловать –

2

Согласен с ответом, как && несет ответственность за это.

Следует отметить здесь, что ваше заявление 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; 
     } 
    } 
0

Например:

if(p && q){ 
// do something 
} 

если p оценивается ed, чтобы быть ложным, остальная часть утверждения не должна оцениваться из-за самого определения && (p И q должно быть истинным). Если p неверно, то утверждение не может быть правдой.

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