Андрей Тарасевич и Кодт, спасибо за содержательные ответы.
Особенно за про неопределенное поведение и за точки следования.
Но теперь вот какой вопрос по следующему коду.
int z = 1;
int z2 = z + ++z + ++z;
z = 1;
int z3 = ++z + z + ++z;
z = 1;
int z4 = ++z + ++z + z;
sprintf(szDbgBuf,"%d %d %d\n",z2,z3,z4);
OutputDebugString(szDbgBuf);
Результат: 7 7 9 (MS VC60)
Имеет ли право компилятор подставлять значение z (там, где оно является операндом, я его выделил) отличное от того, которое оно имело ДО начала вычисления выражения, стоящее за знаком "=" ?
Насколько я помню по теории алгоритмов выражение переводит одно состояние в другое, причем предыдущее состояние не меняется и определяет следующее. Поэтому, кажется, каждый из ++ определяет какие-то дополнительные состояния. Т.е. мне не совсем понятна роль этих дополнительных состояний.