我找到了这篇文章。https:/en.cppreference.comwcpplanguageeval_order。
我也不知道为什么 i = ++i;
和 i = ++i + 2;
是未定义的行为。
第一个例子。
int i = 5;
i = ++i;
结果仍然是6.
如果 i = ++i;
被声明为未定义行为,那么 i = ++j;
也应该说明为未定义的行为(因为赋值可以发生在增量之前?
第二个例子。
int i = 5;
i = ++i + 2;
结果仍然是8。
如果 i = ++i + 2;
被声明为未定义行为,那么 i = ++j + 2;
也应该被声明为未定义行为(因为赋值可以发生在增量和总和之前)?
是什么让 i = ++i;
未定义行为 是你试图同时读和写 i
在同一表达式中,没有序列点。
由 ++
操作符被认为是一种副作用,就像由 =
操作员。 在同一个对象上有两个副作用,或者在同一个对象上有一个副作用和一个读,才会引起问题。 任何可能的评估顺序都会产生同样的结果,这并不重要。
i = ++j;
是没有问题的,因为没有任何对象被写入一次以上,或者在同一个表达式中读和写都没有序列点。