为什么 "i = ++i;" 和 "i = ++i + 2;" 是未定义的行为?
Why are "i = ++i;" and "i = ++i + 2;" undefined behavior?
我找到这篇文章:https://en.cppreference.com/w/cpp/language/eval_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;
undefined behavior 的原因是您试图在同一个表达式中读取和写入 i
而没有序列点。
由 ++
运算符执行的增量被认为是副作用,由 =
运算符执行的赋值也是如此。对同一个对象有两个副作用,或者对同一个对象有一个副作用和一个读取,是导致问题的原因。任何可能的评估顺序都会产生相同的结果并不重要。
i = ++j;
很好,因为没有对象被多次写入或在没有序列点的情况下在同一表达式中读取和写入。
我找到这篇文章:https://en.cppreference.com/w/cpp/language/eval_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;
undefined behavior 的原因是您试图在同一个表达式中读取和写入 i
而没有序列点。
由 ++
运算符执行的增量被认为是副作用,由 =
运算符执行的赋值也是如此。对同一个对象有两个副作用,或者对同一个对象有一个副作用和一个读取,是导致问题的原因。任何可能的评估顺序都会产生相同的结果并不重要。
i = ++j;
很好,因为没有对象被多次写入或在没有序列点的情况下在同一表达式中读取和写入。