Consider the following code:
int main(void) { int f=0x2; // 0010 int x=0x8; // 1000 int r1,r2; if(x | f != 10) printf("yes\n"); else printf("no\n"); r1 = x * 8 + 1; r2 = x << 3 + 1; if(r1==r2) printf("yes\n"); else printf("no\n"); return 0; }
It has 2 problems – both with assumptions on operator precedence:
the first one is the statement:
if(x | f != 10)
We maybe want it to be parsed as
if ( ( x | f ) != 10 )
but the priority of != is above | so we get it parsed as
if ( x | (f != 10))
this produced true (printing “yes”)
The second is:
r1 = x * 8 + 1; r2 = x << 3 + 1;
we all know from first grade the multiply and divide precede plus and minus.
Also any developer knows the multiply by 8 is the same as 3 bits shifting
But … the precedence of bit shifting is bellow plus so it parses the statement as
r2 = x << (3+1)
Conclusion:
Always use parentheses , don’t trust operator precedence (even if you liked your first grade teacher)