Paul Brook wrote:
>James K. Lowden wrote:
1) most combinations of && and || don't need parentheses because
(a && b) || (c && d)
is by far more common than
a && (b || c) && d
and, moreover, broken code fails at runtime, and
I dispute these claims.
The former may be statistically more common, but I'd be surprised if the
difference is that big. I can think of several fairly common situations where
both would be used.
Any time you've got any sort of nontrivial condition, I always find it better
to include the explicit parentheses. Especially if a, b, c, and d are
relatively complex relational expressions rather than simple variables.
I second Paul's points. The precedence of && and || are not widely
enough known that warning about it should be off by default (for people
sane enough to use -Wall).
A couple of data points:
First, I've been writing C and C++ for a living for nearly 20 years now,
and I didn't know that && had higher precedence than ||. I vaguely
recalled that they had different precedence, but I couldn't have told
you which came first without looking it up. I'd happily bet that the
same is true of the overwhelming majority of developers who aren't
compiler hackers. Giving && and || different precedence is one of those
things that feels so totally counterintuitive that I have trouble
remembering it no matter how many times I look it up. I have a firm
coding rule of always parenthesising them when they're used together.
(Likewise &, |, and ^, which have similar issues. I can't remember
whether -Wparentheses warns about those too.)
Second, I just grepped the codebase I'm curently working on (about 60k
lines of C++) for anywhere && and || appear on the same line. I got 49
hits, 29 where && was evaluated before ||, 20 the other way around. (All
of them, I'm happy to say, properly parenthesised.) So while
&&-inside-|| seems to be slightly more common, I'd certainly dispute
James's claim that it's "far more common".
-- Ross Smith