Operator precedence
Operator precedence still surprises me sometimes.
I started off with this code:
digit -= 'a';
Which was really just a reformulation of this operation for converting an ASCII character containing a representation of a decimal digit to a number:
digit -= '0';
I then tried to adjust for the fact that hexadecimal a
is equivalent to decimal 10:
digit -= 'a' + 10;
But the code didn’t work. Only this did:
digit = digit - 'a' + 10;
Operator precedence strikes again. The two forms are not equivalent, because the former is actually equivalent to:
digit -= ('a' + 10);
Which in turn gives us:
digit = digit - ('a' + 10);
Which in turn is equivalent to:
digit = digit - 'a' - 10;
Which clearly isn’t the same as:
digit = digit - 'a' + 10;
So anyway, I think it’s an interesting example of how a programmer’s natural tendency to prefer shorter expressions, combined with an iterative development model, combined with C’s operator precedence rules, can lead you down a path where your code doesn’t work like you think it should.
I am unlikely to make the same mistake again in the future, but I am almost certain to make a different-but-related mistake at some point. Which of course leads us back to the fact that unit testing is essential part of any decent development process.