2015-09-16 2 views

ответ

4

Поскольку оператор || работает как короткое замыкание, если первый операнд true.

Так как первый операнд являетсяtrue (t == true), второе условие (что увеличивает i) не вычисляется.

Во втором случае, первый операнд f является false, следовательно, второй операнд вычисляется и i получает приращение на 2, заканчивая значением 0 + 2 == 2.

Это отличается от оператора &&, который требует, чтобы оба операнда оценивались.

Побитовые операторы & и | также оценивают оба операнда при использовании в булевых условиях.

Резюме

  • b = (t || ((i++) == 0)); // b = true OR... whatever, just true
  • b = (t | ((i++) == 0)); // b = true bitwise or 0 == 0 == true (postfix increment, so i gets incremented after evaluation --> true
  • b = (t | ((++i) == 0)); // b = true bitwise or 0 == 0 == true (prefix increment, so i gets incremented before evaluation --> false
  • b = (t && ((++i) == 0)); // b = true AND 1 == 0 == false (prefix increment, so i gets incremented before evaluation --> false
  • b = (t & ((++i) == 0)); // b = true bitwise and 1 == 0 == false (prefix increment, so i gets incremented before evaluation --> false
+0

как вы получили такое глубокое знание? – rns

+1

@ rns haha, на самом деле, замалчивая нескольких операторов по всему классу и серьезно испортив прототип приложения для Android, сразу же, до того, как последняя версия была продемонстрирована руководству.** Теперь я могу смеяться над этим. – Mena

3

((i++) == 0)) никогда не оценивали, так как это ttrue и || короткое замыкание или оператор, так что второй (справа) операнд вычисляется только тогда, когда первый (левый) операнд является false.

В (f || ((i += 2) > 0)) оба операнда оцениваются, так как f является ложным. Следовательно, i увеличивается с 0 на 2.

1

В дополнении к другим ответам, вы можете найти следующий вопрос использования:

Это объясняет, как логические и побитовые операторы делают и не делает, соответственно, короткое замыкание.

(я бы написал это как комментарий, но пока я не могу комментировать, так как моя репутация слишком низко!)

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