Пара неработающих примеров:
(A && B) || C — когда A=true B=false C=true то return code выражения целиком это true, хотя хочется false.
(A && B) || (! A && C) — A может вызываться дважды
update: если добавить команду exit, то возможно:
( A && { B || exit 1 ; } || C )
Круглые скобки порождают подпроцесс, exit выходит из него. Фигурные скобки - только для для группировки выражения, как обычные скобки в математике. && приоритетней ||, так же как умножение приоритетней сложения. Ну и стандартная unix-путаница "1 это false, 0 это true".