这个自我初始化有效吗?

Joh*_*itb 64 c++ initialization initialization-order

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

int x = x + 1;
int main() {
  return x;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果程序的行为是有效的,那么它是否被定义或未定义.如果定义了,那么x已知的值是main多少?

Jer*_*fin 100

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

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

  • 嗯,令人惊讶的是"在进行任何其他初始化之前,它是多么微妙而又重要".是. (12认同)
  • +1和<acc>表示强标准的引用答案 (10认同)
  • @Martin York:对于其中一个人来说,对于"不要那样做",关于这样的代码(以及其他一些定义了行为的东西)完全没有问题. (8认同)
  • 我希望它是未定义的,因为我们可以说不要写这样的东西很难找出你的意思而不用在标准中查找它. (4认同)

Dum*_*001 11

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

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

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

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


Tom*_*a17 6

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

然后在调用main之前,执行"x = x + 1".

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