为什么是“i = ++i;” 和“i = ++i + 2;” 未定义的行为?

Mal*_*lan 2 c operator-precedence undefined-behavior

我找到了这篇文章:https : //en.cppreference.com/w/cpp/language/eval_order

我不知道为什么i = ++i;并且i = ++i + 2;是未定义的行为。

第一个例子:

int i = 5;

i = ++i;
Run Code Online (Sandbox Code Playgroud)

结果还是6。

如果i = ++i;被声明为未定义行为,那么也i = ++j;应该声明为未定义行为(因为赋值可以在增量之前发生?)。

第二个例子:

int i = 5;

i = ++i + 2;
Run Code Online (Sandbox Code Playgroud)

结果还是8。

如果i = ++i + 2;被声明为未定义行为,那么也i = ++j + 2;应该被声明为未定义行为(因为赋值可以在增量和求和之前发生)?

dbu*_*ush 6

是什么让i = ++i; 未定义行为是,你试图读取和写入i在同一个表达式没有序列点。

++运算符执行的增量被视为副作用,=运算符执行的赋值也是如此。对同一个对象有两个副作用,或者对同一个对象有副作用和读取,是导致问题的原因。任何可能的评估顺序都会产生相同的结果并不重要。

i = ++j; 很好,因为没有对象被多次写入或在没有序列点的同一个表达式中读取和写入。