Я бы сказал, что 99 раз из 100 я бы предпочел быстродействующие операторы короткого замыкания.
Но я нашел две веские причины, по которым я не буду их использовать.
(Кстати, мои примеры в C, где && и || являются короткими замыканиями, а & и | не являются.)
1.) Если вы хотите вызвать две или более функции в операторе if независимо от значения, возвращаемого первым.
if (isABC() || isXYZ()) // short-circuiting logical operator
//do stuff;
В этом случае isXYZ () вызывается, только если isABC () возвращает false. Но вы можете захотеть, чтобы isXYZ () вызывался несмотря ни на что.
Итак, вместо этого вы делаете это:
if (isABC() | isXYZ()) // non-short-circuiting bitwise operator
//do stuff;
2.) Когда вы выполняете логическую математику с целыми числами.
myNumber = i && 8; // short-circuiting logical operator
не обязательно совпадает с:
myNumber = i & 8; // non-short-circuiting bitwise operator
В этой ситуации вы можете получить разные результаты, потому что оператор короткого замыкания не обязательно оценивает все выражение. И это делает его в основном бесполезным для логической математики. Так что в этом случае я бы вместо этого использовал операторы без короткого замыкания (побитовые).
Как я намекал, эти два сценария действительно редки для меня. Но вы можете видеть, что существуют реальные причины программирования для обоих типов операторов. И, к счастью, большинство популярных языков сегодня имеют оба. Даже в VB.NET есть операторы короткого замыкания AndAlso и OrElse. Если у языка сегодня нет и того, и другого, я бы сказал, что он отстал и действительно ограничивает программиста.