有值的整数i = ++i;
和++i;
在哪里有什么区别?i
10
据我说,两者都做同样的递增工作,i
即在完成两个表达式之后i =11
。
有值的整数i = ++i;
和++i;
在哪里有什么区别?i
10
据我说,两者都做同样的递增工作,i
即在完成两个表达式之后i =11
。
i = ++i;
调用未定义的行为,而++i;
没有。
C++03 [第 5/4 节] 说Between the previous and next sequence point a scalar object shall have its stored value modified at most once by the evaluation of an expression
。
Ini = ++i
i
被修改了两次[预增量和赋值],没有任何中间序列点,因此行为在 C 和 C++ 中都是未定义的。
但是i = ++i
在 C++0x 中有很好的定义:)
两次写入i = ++i;
变量i
(一次用于增量,一次用于赋值),两者之间没有序列点。根据 C 语言标准,这会导致未定义的行为。
这意味着编译器可以自由地实现与, i = ++i
as 相同(这在某些与管道和缓存相关的情况下实际上是有意义的)或 as (愚蠢,但在技术上是标准允许的)。i = i + 1
i = i + 2
format C:\
i = ++i 经常但不一定会给出结果
我 = 我;
我+1;
这给出了 i = 10
正如评论所指出的,这是未定义的行为,不应依赖
而 ++i 将永远给予
我=我+1;
给出 i = 11;
因此是正确的做法
如果 i 是标量类型,i = ++i
则为 UB,并且++i
等价于i+=1
. 如果 i 属于类类型,并且该类有一个 operator++ 重载,则
i = ++i
等效于i.operator=(operator++(i))
,它不是 UB,并且++i
只执行++ operator
, 使用您放入其中的任何语义。
第一个的结果是未定义的。