可能重复:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)
i = ++i;
和++i;
之间的区别是i
是一个值为10
的整数?
据我所知,在完成两个表达式i
之后,两者都做同样的增加i =11
的工作。
答案 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 = ++i
中i
被修改两次[pre-increment and assignment],没有任何插入序列点,因此行为在C和C ++中都是Undefined。
但是{C} 0x中定义了i = ++i
:)
答案 1 :(得分:7)
写i = ++i;
两次写入变量i
(一个用于增量,一个用于赋值),两者之间没有sequence point。这,根据C语言标准导致未定义的行为。
这意味着编译器可以自由地实现i = ++i
与i = 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。