(++i)++是未定义行为吗?

6

(++i)++是否是未定义行为?可能会出现这样的情况:前缀递增的副作用发生在获取递增对象之后,以便后缀递增进行操作。这对我来说似乎很奇怪。

我的直觉告诉我,在C++03中这是未定义的,在C++11中是有定义的。我对吗?


43
为什么这么多人问关于这个的问题?别这么做了。它有什么用谁在意 - 它是糟糕的代码,不应该被写成这样。 - jjnguy
13
@jjnguy: 我认为“不应该被写”和“不应该在重要的生产代码中使用”之间是有区别的。有时候故意编写错误的代码以便从中学习是很好的方法。可以以可控的方式使程序失败,测试预期的故障等。 - David
16
应该为C++中未定义行为的问题建立一个专门的stackoverflow网站。 - Idan K
1
我理解基础研究的价值。但是,就我个人而言,我已经厌倦了这些问题,特别是考虑到您已经在该主题上撰写了常见问题解答。对于UB的过度关注已经够了。 - John Dibling
1
提出的重复问题涉及常见的未定义行为,并且可以追溯到2008年。这个问题涉及C++03(已被重复问题覆盖)和C++0x(未被覆盖)。 - David Thornley
显示剩余2条评论
2个回答

12
我的直觉告诉我,在C++03中这是未定义的,在C++11中是定义良好的。
是的,你说得对。在C++03中,行为是未定义的,因为你在两个序列点之间尝试多次修改i。
在C++11中,行为是定义良好的,因为(++i)++等同于(i += 1)++。+=运算符的副作用相对于++(后增量)是有序的,因此行为是定义良好的。

同样重要的是从后缀++的定义中,“++表达式的值计算在操作数对象的修改之前被排序。”因此我们知道++i必须在后缀++的副作用之前完成。 - M.M

-2

这是未定义的行为,因为在两个序列点之间i被多次修改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接