Does the C-faq really say that? You're modifying a variable (i
) twice with an intervening sequence point, which simply gives undefined behavior, nothing more or less. It could print 49 or 56, or 73295, or nothing at all, or "Formatting hard drive..." (and proceed to do exactly that).
Edit: As to what's likely to happen, it comes down to this: with a post-increment, the increment part can happen anywhere between the time you retrieve the value, and the next sequence point. The generated code could easily act like this:
int temp = i;
++i;
int temp2 = i;
++i;
printf("%d\n", temp * temp2);
On the other hand, it could also act like this:
int temp = i;
int temp2 = i;
++i;
++i;
printf("%d\n", temp * temp2);
While one of these two is likely, the standard doesn't mandate either one. As I said above, it's undefined behavior, which means the C standard doesn't place any limitation on what the code could do.