我有这个问题,我之前想过,但认为这不是微不足道的回答
int x = x + 1;
int main() {
return x;
}
我的问题是程序的行为是定义的还是未定义的,如果它是有效的。如果已定义,那么x
已知的值是否在main
?
我有这个问题,我之前想过,但认为这不是微不足道的回答
int x = x + 1;
int main() {
return x;
}
我的问题是程序的行为是定义的还是未定义的,如果它是有效的。如果已定义,那么x
已知的值是否在main
?
我很确定它已定义,并且 x 的值应该为 1。§3.6.2/1 说:“在进行任何其他初始化之前,具有静态存储持续时间 (3.7.1) 的对象应进行零初始化 (8.5)。 "
在那之后,我认为这一切都很简单。
我的问题是程序的行为是定义的还是未定义的,如果它是有效的。如果已定义,x 的值是否在 main 中已知?
这段代码绝对不干净,但对我来说它应该可以预见地工作。
int x
将变量放入程序开始时定义为零的数据段。之前main()
,调用静态初始化器。因为x
那是代码x = x + 1
。x = 0 + 1 = 1
. 因此 main() 将返回 1。
x
如果是在堆栈上分配的局部变量,代码肯定会以不可预测的方式工作。与数据段不同,堆栈状态几乎可以保证包含未定义的垃圾。
'x' 变量存储在 .bss 中,加载程序时用 0 填充。因此,当程序加载到内存中时,“x”的值为 0。
然后在调用 main 之前,执行“x = x + 1”。
我不知道它是否有效,但行为不是未定义的。
在 main 调用之前 x 必须初始化为 0,因此它的值必须是 1,你输入 main,你将返回 1。这是一个定义的行为。