Сообщение 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 оператором ++.
Да, действительно, это, оказывается, является свойством оператора присваивания:
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 оператором ++.
Да, действительно, это, оказывается, является свойством оператора присваивания:
[Upd]
Да, но как в таком случае понимать пример из 1.9/15?
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 }