Поскольку оператор ||
работает как короткое замыкание, если первый операнд 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
как вы получили такое глубокое знание? – rns
@ rns haha, на самом деле, замалчивая нескольких операторов по всему классу и серьезно испортив прототип приложения для Android, сразу же, до того, как последняя версия была продемонстрирована руководству.** Теперь я могу смеяться над этим. – Mena