On Mon, 30 Jan 2023, Dan Cross wrote:
I think C is a language that people _think_ is simple
to understand,
and perhaps _was_ simple to understand, but is actually remarkably
subtle and a _lot_ of people don't actually have a great handle on how
it really works anymore. Particularly now, when the compiler people
seem to be prizing optimization above all else and so even obvious
behavior that's technically "undefined" results in unexpected behavior
(e.g., `if (a > 0 && b > 0 && a*b) < 0) overflow(); // signed
integer
overflow is UB`. Maybe sadly, C hasn't been a portable macro assembler
for decades now.
I always assume compiler braindeath. Always use parentheses; never assume
any specific order of precedence.
I've actually been bitten by compilers doing unexpectedly stupid things,
so I guard around them. I'll never merge two chars into a short with
c=(a<<8)|b;
I will ALWAYS do this:
c=a;
c<<=8;
c|=b;
because 16-bit MS-DOS compilers will ALWAYS manage to blunder that, though
32-bit compilers get it right (the sane thing to do would be to treat it
as a word bitshift, but the compiler treats it as a byteshift because a is
uint8_t).
I'll never do if (a==b&&c==d), always if ((a==b)&&(c==d)).
I always try to assume the compiler will wreck my code in hilariously
braindamaged ways and code so precisely that it cannot do so.
<snip>
Imitation is the most sincere form of flattery.
The actual saying continues "...that mediocrity can make to greatness",
which changes the meaning a bit. ;p
-uso.