Неупорядоченные вычисления значений (также известные как точки последовательности)

Извините, что снова открываю эту тему, но размышления над этой темой сами по себе начали давать мне неопределенное поведение. Хочу перейти в зону четко определенного поведения.

Учитывая

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) являются

16
задан Potatoswatter 1 November 2015 в 03:05
поделиться