i = ++ i和++ i之间的区别

时间:2010-10-12 11:49:44

标签: c++ c operator-precedence pre-increment

  

可能重复:
  Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)

i = ++i;++i;之间的区别是i是一个值为10的整数?

据我所知,在完成两个表达式i之后,两者都做同样的增加i =11的工作。

6 个答案:

答案 0 :(得分:10)

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

i = ++ii被修改两次[pre-increment and assignment],没有任何插入序列点,因此行为在C和C ++中都是Undefined。

但是{C} 0x中定义了i = ++i:)

答案 1 :(得分:7)

i = ++i;两次写入变量i(一个用于增量,一个用于赋值),两者之间没有sequence point。这,根据C语言标准导致未定义的行为。

这意味着编译器可以自由地实现i = ++ii = i + 1相同,i = i + 2(这在某些管道和缓存相关的情况下实际上是有意义的),或者{ {1}}(愚蠢,但技术上允许标准)。

答案 2 :(得分:3)

i = ++我会经常(但不一定)给出结果

i = i;

我+1;

给出i = 10

正如评论所指出的,这是未定义的行为,永远不应该依赖

而++我总是会给出

i = i + 1;

给出i = 11;

因此是正确的做法

答案 3 :(得分:2)

如果我是标量类型,那么i = ++i是UB,而++i相当于i+=1。 如果我是类类型,那么那个类的运算符++重载 i = ++i相当于i.operator=(operator++(i)),而不是UB,而++i只执行++ operator,无论您使用哪种语义。

答案 4 :(得分:1)

第一个结果未定义。

答案 5 :(得分:1)

这些表达式与sequence points相关,最重要的是,第一个表达式会产生undefined behavior