可能是重复的问题:
能否解释这些未定义的行为 (i = i++ + ++i, i = i++等)
当 i
是一个值为 10
的整数时,i = ++i;
和 ++i;
之间有什么区别?
根据我的理解,两者都可以将 i
增加1,也就是执行完这两个表达式后,i = 11
。
可能是重复的问题:
能否解释这些未定义的行为 (i = i++ + ++i, i = i++等)
当 i
是一个值为 10
的整数时,i = ++i;
和 ++i;
之间有什么区别?
根据我的理解,两者都可以将 i
增加1,也就是执行完这两个表达式后,i = 11
。
i = ++i;
会引发未定义行为,而 ++i;
则不会。
C++03 [5/4节]规定在前后两个序列点之间,标量对象的存储值至多被一个表达式修改一次
。
在 i = ++i
中,i
在没有任何中间序列点的情况下进行了两次修改(预增和赋值),因此该行为在C和C++中都是未定义的。
然而,在 C++0x 中,i = ++i
是有定义的 :)。
i = ++i
引发未定义行为,因为在两个序列点之间多次修改了 i
。 - Prasoon Sauravi = ++i;
会使变量 i
被写入两次(一次是加一操作,一次是赋值操作),而这两个操作之间缺少一个序列点。根据 C 语言标准规定,这意味着它引起了未定义的行为。i = ++i
实现为与 i = i + 1
相同,或者实现为 i = i + 2
(在某些与流水线和缓存相关的情况下,这实际上是有意义的),或者实现为 format C:\
(虽然荒谬,但在技术上被允许)。i = ++i
经常会但不一定会给出结果i = i;
i +1;
即得 i = 10
正如评论所指出的那样,这是未定义的行为,不能依赖此方式
而 ++i 总是会给出
i = i+1;
即得 i = 11;
因此这是正确的操作方式