x = y++;
Here, y++ is post increment operator which returns the value of y, and increments y. What happens to the returned value? It is assigned to x. So, this assignment or the increment happens first? This is not specified by precedence/associativity rules and is internal to the compiler implementation as C standard does not fix a strict order. To help the programmer C standard says to avoid writing codes where the order of these executions changes the output. That is, never to modify a variable more than once in an arithmetic expression. (When we have logical && and || due to short circuit rules, we may skip undefined behaviour).
Here, a++ is done 3 times in an arithmetic expression -