In both cases you are hitting undefined behavior. Anything can happen. In each post-fix operator the compiler must retrieve the value of the variable before performing the operation, but the order of execution of that operation with respect to the other post-fix operations in the code is undefined.
For the simpler expression int c = a++ + a--;
all these are valid execution paths according to the standard:
// assume a=10
// option 1
int c = a + a; // 20
a++; a--;
// option 2
register int tmp = a; // the register keyword is just to show that no real memory is created
a++;
int c = tmp + a; // 21
a--;
// option 3
register int tmp = a;
a--;
int c = tmp + a; // 19
a++;