Информация об изменениях

Сообщение Re[4]: Приоритет операторов в C++ от 27.01.2017 7:50

Изменено 27.01.2017 8:00 rg45

Re[4]: Приоритет операторов в C++
Здравствуйте, N. I., Вы писали:

NI>Если p1 и p2 — это обычные указатели, указывающие на разные неперекрывающиеся объекты скалярного типа, отличного от bool, то по правилам C++11 из-за множественной модификации undefined behavior тут возникнуть не может. Модификация результата ++*p1 оператором = выполняется после value computation для ++*p1, а это value computation выполняется после модификации результата *p1 оператором ++.


Да, действительно, это, оказывается, является свойством оператора присваивания:

5.17/1
In all cases, the assignment is sequenced after the value computation of the right and left operands, and before the value computation of the assignment expression.

Re[4]: Приоритет операторов в C++
Здравствуйте, N. I., Вы писали:

NI>Если p1 и p2 — это обычные указатели, указывающие на разные неперекрывающиеся объекты скалярного типа, отличного от bool, то по правилам C++11 из-за множественной модификации undefined behavior тут возникнуть не может. Модификация результата ++*p1 оператором = выполняется после value computation для ++*p1, а это value computation выполняется после модификации результата *p1 оператором ++.


Да, действительно, это, оказывается, является свойством оператора присваивания:

5.17/1
In all cases, the assignment is sequenced after the value computation of the right and left operands, and before the value computation of the assignment expression.


[Upd]
Да, но как в таком случае понимать пример из 1.9/15?

void f(int, int);
void g(int i, int* v) {
i = v[i++]; // the behavior is undefined
i = 7, i++, i++; // i becomes 9
i = i++ + 1; // the behavior is undefined
i = i + 1; // the value of i is incremented
f(i = -1, i = -1); // the behavior is undefined
}

Почему в выделенных выражениях возникает неопределенное поведение?