Does C Standard define side effects of postfix increment

Consider the following (contrived) example:

int a = 0; // &a = 0x1000
int *p = &a;
p = *(p++); // What will be the value of p?

I can think of at least two plausible implementations for the last line, assuming x86 architecture and sizeof(int) == 4:

// First
newp = p + 1; // newp = 0x1004
p = *p;       // p = *0x1004
p = newp;     // p = 0x1004

// Second
p = *p;       // p = 0x0
p = p + 1;    // p = 0x4

Visual Studio 2015 (debug build) apparently chooses the second option and shows 0x4.

The question is: does C Standard rule the second choice to be correct, or this is implementation dependent?