64

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

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

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

4

4 回答 4

101

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

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

于 2010-07-22T13:06:34.560 回答
11

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

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

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

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

于 2010-07-22T13:12:46.263 回答
6

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

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

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

于 2010-07-22T13:10:19.523 回答
0

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

于 2010-07-22T14:02:24.213 回答