【问题标题】:Is (++i)++ undefined behavior?(++i)++ 是未定义的行为吗?
【发布时间】:2011-05-19 19:42:39
【问题描述】:

(++i)++ 是未定义的行为吗?在检索增量对象以进行后缀增量操作后,前缀增量的副作用是否可能发生?这对我来说似乎很奇怪。

我的直觉是这在 C++03 中是未定义的,而在 C++11 中是明确定义的。我说的对吗?

【问题讨论】:

  • 为什么这么多人问这个问题?只是不要这样做。谁在乎它的作用 - 这是糟糕的代码,无论如何都不应该编写。
  • @jjnguy:我会区分“永远不应该被编写”和“永远不应该用于做任何重要事情的生产代码”。编写已知的错误代码以便从中学习通常是件好事。以可控的方式让事情失败,测试预测的失败,等等。
  • 应该有一个专门的stackoverflow站点来解决C++中未定义的行为问题
  • 我明白基础研究的价值。但是,我已经回答了这些问题,特别是考虑到您编写了有关该主题的常见问题解答。对 UB 的痴迷已经够了。
  • 提议的副本是关于常见的未定义行为,并且可以追溯到 2008 年。这个问题是关于 C++03(由副本涵盖)和 C++0x(不是)。

标签: c++ c++11 language-lawyer undefined-behavior sequence-points


【解决方案1】:

我的直觉是这在 C++03 中是未定义的,而在 C++0x 中是明确定义的。

是的,你是对的。该行为在 C++03 中未定义,因为您试图在两个序列点之间多次修改 i

该行为在 C++0x 中定义良好,因为 (++i)++ 等价于 (i += 1)+++= 运算符的副作用相对于 ++(后递增)进行排序,因此行为定义明确。

【讨论】:

  • 同样重要的是来自postfix-++的定义,“++表达式的值计算是在操作数对象修改之前排序的。”所以我们知道++i必须在后缀-++的副作用之前完成
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多