这个自初始化有效吗?
-
27-09-2020 - |
题
我有这个问题,我之前想过,但我认为回答这个问题并不简单
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。这是一种定义的行为。
不隶属于 StackOverflow