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

Сообщение Re[6]: Приоритет операторов в C++ от 27.01.2017 13:33

Изменено 27.01.2017 14:11 rg45

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

R>>

R>>

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


NI>До C++17 эти две модификации не были упорядочены между собой, т.к. здесь инкремент — постфиксный, а у него модификация следует за вычислением значения...


Что-то я как-то медленно соображать стал. Выходит, что в случае использования постинкремента, в отличие от преинкремента, применение побочного эфффекта не является необходимым для вычисления правой части оператора присваивания, таким образом инкремент и присваивание оказываются неупорядоченными друг с другом. Правильно?
Re[6]: Приоритет операторов в C++
Здравствуйте, N. I., Вы писали:

R>>

R>>

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


NI>До C++17 эти две модификации не были упорядочены между собой, т.к. здесь инкремент — постфиксный, а у него модификация следует за вычислением значения...


Что-то я как-то медленно соображать стал. Выходит, что в случае использования постинкремента, в отличие от преинкремента, применение побочного эфффекта не является необходимым для вычисления правой части оператора присваивания, таким образом инкремент и присваивание оказываются неупорядоченными друг с другом. Правильно?

В этом контексте нелишним будет упомянуть правила для постфиксных инкремента/декремента:

The value computation of the ++ expression is sequenced before the modification of the operand object.


Таким образом, при использовании постинкремента в правой части, мы знаем только, и присваивание и инкремент произойдут после value computation, но в каком порядке — неизвестно.