This question already has an answer here:
Why are these constructs (using ++) undefined behavior?
All of the compilers are right.
In the line
a = b = a+++a;
you invoke Undefined Behaviour, because
a gets modified twice without an intervening sequence point.
If you do that, the C++ standard gives the compilers licence to do whatever they like.