i = ++ i和++ i之间的区别
可能重复:
谁能解释这些未定义的行为(i = i ++ + ++ i,i = i ++等…)
i = ++i;
之间有什么区别i = ++i;
和++i;
其中i
是值为10
的整数?
根据我的说法,在完成两个表达式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
。
在i = ++i
i
被修改两次[pre-increment and assignment],没有任何插入序列点,因此行为在C和C ++中都是Undefined。
但是i = ++i
在C ++ 0x中定义得很好:)
写i = ++i;
写入变量i
两次(一个用于增量,一个用于赋值),两者之间没有序列点 。 这样,根据C语言标准会导致未定义的行为。
这意味着编译器可以自由地实现i = ++i
与i = i + 1
相同,因为i = i + 2
(这在某些管道和缓存相关的情况下实际上是有意义的),或者format C:\
(愚蠢,但技术上允许标准)。
i = ++我会经常(但不一定)给出结果
我= i;
我+1;
这给了i = 10
正如评论所指出的,这是未定义的行为,永远不应该依赖
而++我将永远给予
i = i + 1;
给出i = 11;
因此,这是正确的做法
如果我是标量类型,则i = ++i
是UB,而++i
等于i+=1
。 如果我是类类型并且有一个运算符++重载该类,那么i = ++i
相当于i.operator=(operator++(i))
,这是非UB,而++i
只是执行++ operator
,无论你放入哪种语义。
第一个结果是未定义的。
这些表达式与序列点相关,最重要的是,第一个表达式导致未定义的行为 。