Обновленный ответ :
Извините, я пропустил слово "логический" в вашем вопросе, хотя оно там . (Я позволил себе немного подчеркнуть это при редактировании.)
Рассмотрим случай, когда вы хотите, чтобы побочные эффекты всегда возникали независимо от того, оценивает ли левое выражение true
или false
. Например, контраст:
if (foo() & bar()) {
// Only call this if both operations returned true
}
с
if (foo() && bar()) {
// Only call this if both operations returned true
}
Предположим, что и foo
, и bar
имеют эффекты, которые мы хотим, чтобы происходило независимо от того, foo
возвращает true
или false
. В первом примере я знаю , что bar
всегда будет вызываться и будет иметь эффект. В последнем, конечно, bar
может или не может быть вызван. Если бы у нас не было версии без короткого замыкания, нам пришлось бы использовать временные переменные:
boolean fooResult, barResult;
fooResult = foo();
barResult = bar();
if (fooResult && barResult) {
// ...
}
Вы можете утверждать (я, вероятно, хотел бы), что вы должны сделать это в любом случае , потому что слишком легко неправильно прочитать if (foo() & bar())
, но мы идем, прагматическая причина отсутствия короткого замыкания версии.
Оригинальный ответ :
Как бы вы предложили &
(или |
) быть оператором с коротким замыканием? С &&
и ||
это имеет смысл, потому что вы имеете дело с булевыми условиями: они могут быть истинными или ложными, оттенки серого отсутствуют. Но &
и |
имеют дело с битами, а не с логическими значениями. Результатом является число. Я имею в виду, я думаю, &
не мог бы оценить правую сторону, если бы левая сторона была 0
, и аналогично |
не мог бы оценить это, если бы левая сторона была полностью битовой для любого тип был, но я не вижу особого смысла делать один крайний случай каждого оператора значимым (по сравнению с 254 или более другими случаями).