这个自我初始化有效吗?

时间:2010-07-22 12:57:32

标签: c++ initialization initialization-order

我有这个问题,我之前想过这个问题,但认为回答并非易事

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

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

4 个答案:

答案 0 :(得分:100)

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

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

答案 1 :(得分:11)

  

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

这段代码绝对不干净,但对我来说它应该可以预测。

int x将变量放入数据段中,该数据段在程序启动时定义为零。在main()之前,调用静态初始值设定项。 x代码为x = x + 1x = 0 + 1 = 1。因此main()将返回1.

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

答案 2 :(得分:6)

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

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

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

答案 3 :(得分:0)

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