The best you can do is read the comments of the author of the programs on IOCCC. They describe how they manage to confuse their code. Here are a few pointers:
Short and meaningless identifiers
Because a=aaa*aa; will always be more confusing than result = value * factor;
In order to have short identifiers, obfuscators, as a rule, even #define lot of things.
Array Reverse Indexing
You just need to remember that var[3] and 3[var] equivalent.
Digraphs and Trigraphs
if(a< <:b+aa??))??<f();%>
should be less readable than:
if (a < (b+aa)) { f(); }
Related characters
Sometimes it's hard to say appart l , 1 and I or o , 0 and O For example, if you write 10l , I am sure everyone will read 101 instead.
Coding Style Guidelines
Generally speaking, just try to find good coding guidelines and try to break them all. Those documents that you can find anywhere on the Internet can help you more than most things and allow you to buy nothing.
Here are some links:
source share