let me try to elaborate what redpepper stated:
the result has to do with how arguments are passed to function. standard C func call pushes argusments from right to left (that's why printf can take variable number of args). So if you examine assembly code correspondin to the program, the order of operations is:
1) increment a ( ++a);
2) push a into stack; (value 11)
3) push a into stack ( a in 'a++'; so value 11)
4) increment a ( a++)
5) push the format string into stack
6) control pass to printf()
7) pop stack ( a couple of times)
compiler works this way will produce (a++=11 ++a=11) which I verified using gcc.
If args are pushed from left to right, I expect to see 'a++=10 ++a=12'.