The behavior of "c = a++ + ++a + a++;" is undefined; the result will vary based on the compiler, optimization settings, surrounding code, etc.
The problem is that the order in which each subexpression is evaluated and the order in which each side effect is applied is unspecified; there's no guarantee that each subexpression is evaluated left-to-right, and there's no guarantee that each side effect is applied immediately after the expression is evaluated. The compiler is explicitly given the freedom to reorder operations for optimization purposes, as long as they give the same result. Because of this, the behavior on attempting to modify the same object through the evaluation of more than expression without an intervening sequence point is explicitly left undefined by the language standard; the compiler isn't required to handle the expression in any particular way, so any result is considered "correct".
Note that an expression like "a++ && a++" is well-defined, because the && operator forces left-to-right evaluation and introduces a sequence point; the left hand "a++" is fully evaluated and the side effect applied before the right hand "a++" is evaluated.
If you really want to know how gcc evaluates the expression, look at the generated machine code (either by using the -S option or the -Wa,-aldh option). Just don't expect that to be consistent from program to program.