The increment is done immediately after the value is used, which is a fairly precise definition of "when". It is the order of evaluation of arguments to a function that was left implementation dependent, although I do not believe that you would ever get "printf x,x+1;x+=1" (from your example).
int x = 1;
// Could be 1, 1 or 2, 1 depending on order of evaluation of args.
printf( "%d, %d\n", x, x++);
x = 1;
// Guaranteed 1, 1 (order of evaluation defined)
cout << x << ", " << x++ << endl;