Для языков C, C ++, C #, Java и других .NET булевы выражения оптимизированы так, что, как только будет известно достаточно, ничего больше не будет оценено.
Старый трюк для создания запутанного кода состоял в том, чтобы использовать это для создания операторов if, таких как:
a || b();
если «a» истинно, «b ()» никогда не будет оцениваться, поэтому мы можем переписать его в:
if(!a)
b();
и аналогично:
a && b();
станет
if(a)
b();
Обратите внимание , что это действительно только для || и && оператор. Два оператора | и & является побитовым или, и и, соответственно, и поэтому не «оптимизированы».
EDIT:
Как уже упоминалось, попытка оптимизировать код с помощью логики короткого замыкания очень редко тратится время.
Сначала идите для ясности, потому что это легче читать и понимать. Кроме того, если вы попытаетесь быть слишком умным, простое изменение порядка терминов может привести к совершенно другому поведению без видимой причины.
Во-вторых, идите на оптимизацию, но только после синхронизации и профилирования. Слишком много разработчиков делают преждевременную оптимизацию без профилирования. В большинстве случаев это совершенно бесполезно.