The expression is ill-defined wrt. the C-Standard. he only rule you have is that x is incremented before being evaluated and both arguments of the multiplication are evaluated before being multiplied. calling the incrementations inc1 and inc2, the evaluations ev1 and ev2 and the multiplication mult, you have inc1<ev1, inc2<ev2 and ev1<mult, ev2<mult where < is the order of computation. So you could have for example
inc1<ev1<inc2<ev2<mult or inc1<inc2<ev1<ev2<mult or inc2<ev2<inc1<ev1<mult
yielding different results. Different compilers on different architectures might use the same ordering, but a compiler might use a different ordering when it is more efficient.
Similarly for the cubic expressions the compiler seems to choose (notations analogous as above)
or something similar, but other orders would be permissable too.
So in general don’t use such a construct