! has highest precedence, then &&, then finally ||.
So (true || true && !true) evaluates as (true || true && false) (true || false) true
The three logical operators are,
But you didn't specify the precedence -- in an expression like a || !b && c, what order do things get evaluated?
a || !b && c
|| = or && = and ! = not