Извините, что снова открываю эту тему, но размышления над этой темой сами по себе начали давать мне неопределенное поведение. Хочу перейти в зону четко определенного поведения.
Учитывая
int i = 0;
int v[10];
i = ++i; //Expr1
i = i++; //Expr2
++ ++i; //Expr3
i = v[i++]; //Expr4
, я думаю о приведенных выше выражениях (в таком порядке) как
operator=(i, operator++(i)) ; //Expr1 equivalent
operator=(i, operator++(i, 0)) ; //Expr2 equivalent
operator++(operator++(i)) ; //Expr3 equivalent
operator=(i, operator[](operator++(i, 0)); //Expr4 equivalent
Теперь перейдем к поведению. Вот важные цитаты из C ++ 0x .
$ 1.9 / 12- "Оценка выражения (или подвыражение) в целом включает оба вычисления значений (включая определение личности объект для оценки lvalue и получение значения, ранее присвоенного объект для оценки rvalue) и инициирование побочных эффектов »
$ 1.9 / 15-« Если побочный эффект на скалярную объект не имеет последовательности относительно либо другой побочный эффект от того же скалярный объект или значение вычисление с использованием значения тот же скалярный объект, поведение undefined. "
[Примечание: расчеты значений и дополнительные эффекты, связанные с различными выражения аргументов не имеют последовательности. —Конечное примечание]
$ 3.9 / 9- "Арифметические типы (3.9.1), типы перечисления, типы указателей, указатель на типы членов (3.9.2), std :: nullptr_t и cv-квалифицированный версии этих типов (3.9.3) являются