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