我有这个问题,我之前想过,但我认为回答这个问题并不简单

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。这是一种定义的行为。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top