【问题标题】:Is this self initialization valid?这个自初始化有效吗?
【发布时间】:2011-03-19 13:15:22
【问题描述】:

我有这个问题,我之前考虑过,但认为这不是微不足道的回答

int x = x + 1;
int main() {
  return x;
}

我的问题是程序的行为是已定义还是未定义,如果它完全有效。如果已定义,x 的值是否在 main 中已知?

【问题讨论】:

  • 有趣。至少 GCC 给出 1,即使是 -std=c++98 -pedantic
  • 用 MSVC9 (15.00.30729.01) 编译得到 1。
  • 序列点浮现在脑海中en.wikipedia.org/wiki/Sequence_point
  • 为什么有人会写这样的代码?如果有的话,这可能/会混淆您正在使用的静态分析器。我会认为行为未定义,即使许多编译器给出一致的结果 x=1。
  • @Schedler 我建议不要使用此类代码。这纯粹是一个测验,我没有任何实际背景。 :)

标签: c++ initialization initialization-order


【解决方案1】:

我很确定它已定义,并且 x 应该具有值 1。§3.6.2/1 说:“具有静态存储持续时间 (3.7.1) 的对象应在任何其他初始化之前进行零初始化 (8.5)发生。”

在那之后,我认为这一切都很简单。

【讨论】:

  • 嗯,令人惊讶的是,“在任何其他初始化发生之前”是多么微妙而重要。是。
  • 我希望它是未定义的,因为那时我们可以说不要写这样的东西,如果没有在标准中查找就很难理解你的意思。
  • @Martin York:对于这样的代码(以及许多其他已定义行为的事情),我对说“不要那样做”完全没有问题。
  • 很好的答案! :-)
【解决方案2】:

我的问题是程序的行为是已定义还是未定义,如果它完全有效。如果已定义,那么 x 的值是否在 main 中已知?

这段代码肯定不干净,但对我来说它应该可以正常工作。

int x 将变量放入程序开始时定义为零的数据段。在main() 之前,调用了静态初始化程序。对于x,即代码x = x + 1x = 0 + 1 = 1。因此 main() 将返回 1。

如果x 是在堆栈上分配的局部变量,代码肯定会以不可预知的方式工作。与数据段不同,堆栈状态几乎可以保证包含未定义的垃圾。

【讨论】:

    【解决方案3】:

    .bss 中存储的“x”变量,在加载程序时用 0 填充。因此,当程序加载到内存中时,'x' 的值为 0。

    然后在调用 main 之前,执行“x = x + 1”。

    我不知道它是否有效,但行为不是未定义的。

    【讨论】:

      【解决方案4】:

      在 main 调用之前,x 必须初始化为 0,因此它的值必须是 1,当你输入 main 时,你将返回 1。这是一个定义的行为。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-10
        • 2011-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多