No, the standard doesn't require that x++ means that x is incremented _immediately_ after taking the value, only that x is incremented _some_time_ after taking its value (I think the Standard talks about "sequence points", only requiring that side effects are applied relative in some way to those points). So x++ + x++ could be equivalent to x + (x+1); x+=2, or (x+1) + x; x+=2, but it's equally valid to interpret the code as x + x; x+=2; which is clearly what VS2005 is doing here. This is not wrong, IMHO it's a neat solution because it means (in VS2005) you can effectively ignore postincrement (and presumably also preincrement) operators when trying to figure out what an expression means. The z= expression simply becomes z = x + x + y; x++;x++;y++, but that is by no means the only way it could work, and if the code is ported to a different OS then it could behave differently, thus introducing subtle and probably extremely hard to track down bugs (because even when looking directly at the bug it'll hide behind your understanding of how VS2005 works, it'll only appear once you stop thinking in VS2005 and start thinking in, say, GCC).
What version of what compiler and OS are you using?