I expect many people know this one, but it's a useful teaching aid when understanding the relationship between arrays and pointers
int array[10];
*(array+1) = 56;
array[2] = 4;
3[array] = 27;
The first two are obvious, but the third is also legal. It works because array indexing is just sugar for pointer arithmetic, so array[2]=4 is identical in meaning to *(array+2)=4. Therefore 3[array]=27 is identical to *(3+array)=27 and so is legal. But just because you can doesn't mean you should.The best, most entertaining book I've ever read on C covered that (unless I'm misremembering, but I doubt it): Expert C Programming.
https://www.goodreads.com/book/show/198207.Expert_C_Programm...
> The first two are obvious, but the third is also legal.
D doesn't have that bug!
In 44 years of C programming, I've never encountered a legitimate use for the 3rd. (Other than Obfuscated C, that is.))
It's not a bug. You're seeing the difference between "this is how you're taught to access arrays" and "this is how array access actually works".
Since the Standard specifies what that does, pedantically it is not a bug. Ok.
But I call it a bug because it has no use and just pointlessly confuses people.
Agreed - I've only been programming C for 38 years but I've also never found a legitimate use. However I have used it to illustrate a point when teaching C to beginners - it looks so odd they tend to remember it.