i = whatever is "changing i inside the expression". It is taking the right side and assigning it to i.
the expression is:
"A single expression should not cause the same object to be modified twice or to be modified and then inspected" C programming FAQs by Steve Summit.
i = i++;
a[i] = i++;
are both undefined, and undefined is the strongest language used in the C standard to describe stuff that you should never do.