Take the following piece of code for example:

void main(void) { int a = 24; int b = 8; if (a & b != 0) printf("A\n"); else printf("B\n"); }

Considering that 24 & 8 equals 8, the first glance assumption is that this code will print A. However, due to operator precedence, the *if* condition is equivalent with:

a & (b != 0)

As *b* is not 0, and *a* is not odd, the code will print B. So to ensure that *&* is evaluated first, parentheses should be used around *a & b*, like this:

... if ( (a & b) != 0) ...

The general rule of thumb is that, if you don’t want to keep track of precedence rules, you should always use parentheses on the expression involved in relational operations.

Otherwise, remember that arithmetic operators (i.e. multiplication, division, modulus, addition and subtraction) and bitwise shift operators have higher precedence and do not require parentheses. On the other hand, logical operators (bitwise or logical) have lower precedence and need parentheses in relational expressions (unless of course, you do it on purpose).

References

[1] Any C operator precedence table ( I used this )