11

可能重复:
谁能解释这些未定义的行为(i = i++ + ++i,i = i++ 等……)

有值的整数i = ++i;++i;在哪里有什么区别?i10

据我说,两者都做同样的递增工作,i即在完成两个表达式之后i =11

4

6 回答 6

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

Ini = ++i i被修改了两次[预增量和赋值],没有任何中间序列点,因此行为在 C 和 C++ 中都是未定义的。

但是i = ++i在 C++0x 中有很好的定义:)

于 2010-10-12T11:50:49.883 回答
7

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

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

于 2010-10-12T11:56:35.603 回答
3

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

我 = 我;

我+1;

这给出了 i = 10

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

而 ++i 将永远给予

我=我+1;

给出 i = 11;

因此是正确的做法

于 2010-10-12T11:56:48.610 回答
2

如果 i 是标量类型,i = ++i则为 UB,并且++i等价于i+=1. 如果 i 属于类类型,并且该类有一个 operator++ 重载,则 i = ++i等效于i.operator=(operator++(i)),它不是 UB,并且++i只执行++ operator, 使用您放入其中的任何语义。

于 2010-10-12T12:01:45.210 回答
1

第一个的结果是未定义的。

于 2010-10-12T11:51:30.850 回答
1

这些表达式与序列点相关,最重要的是,第一个导致未定义的行为

于 2010-10-12T11:57:52.730 回答