当前位置: 首页 > 知识库问答 >
问题:

在C++中,用自身初始化全局变量是否有未定义的行为?

段干靖
2023-03-14
int i = i;

int main() { 
 int a = a;
 return 0;
} 

共有1个答案

纪翰
2023-03-14

令人惊讶的是,这并不是未定义的行为。

静态初始化[Basic.Start.Static]

如果具有静态或线程存储持续时间的变量或临时对象被常量初始化,则执行常量初始化。如果不执行常量初始化,则具有静态存储持续时间或线程存储持续时间的变量被零初始化。零初始化和常量初始化合在一起称为静态初始化;所有其他初始化都是动态初始化。所有静态初始化都在任何动态初始化之前发生。

int i = i;
    null
 类似资料:
  • 当我在Inno Setup脚本的< code>[Code]部分(Pascal脚本)声明一个全局变量时,它是否自动初始化为零/空值?还是必须显式初始化它(例如在< code>InitializeSetup事件函数中)? 根据我的经验,变量是零初始化的。不过,我不确定我是否只是运气不好。 我已经完成了10.000次测试代码迭代。全局变量(或各种类型、整数、字符串、指针)始终为零初始化。

  • 我已经检查过自己,我写了一个这样的程序 我运行了几次程序,结果始终是一样的,零。我在C中尝试过,结果是一样的。 但我的教科书说 如果未初始化函数内定义的变量,则该变量值将保持未定义状态。这意味着该元素具有以前驻留在内存中该位置的任何值。 当程序始终将可用内存位置分配给变量时,这怎么可能?它怎么可能是零以外的东西(我假设默认的可用内存值为零)?

  • 如果我有: 很明显,这个表达式后面的应该是零,但我看到的任何地方,他们都说这个代码的行为是未定义的,而不仅仅是的值(直到减法之前)。 很明显,编译器可以简单地在变量中使用它认为“方便”的任何垃圾值,并且它将按照预期工作。这种方法有什么问题?

  • C++标准1998的一些相关摘录: 根据标准,静态初始化发生在动态初始化之前,动态初始化可能发生在输入之后。我的问题是:在输入之前,全局变量是否初始化为?然后,如果所有线程都是在输入之后创建的,则全局变量的静态初始化保证是线程安全的。

  • 问题内容: 哪种方法检查变量是否已初始化是更好/正确的方法?(假设变量可以容纳任何内容(字符串,整数,对象,函数等)) 要么 要么 问题答案: 该运营商将检查变量真的不确定。 该运营商,不同于其他运营商,不会抛出 的ReferenceError 与未声明的变量使用时例外。 但是,请注意将返回。我们必须小心避免将变量初始化为的错误。为了安全起见,我们可以改用以下方法:

  • 问题内容: 今天,当我看到全局变量在某些情况下具有价值时,我感到非常惊讶。 例: 给出为 在这里,为什么JavaScript引擎将全局值视为。我知道JavaScript是一种解释语言。如何考虑函数中的变量? 这是JavaScript引擎的陷阱吗? 问题答案: 这种现象称为:JavaScript变量提升 。您绝对不会在函数中访问全局变量。您只访问局部变量。 您的代码等效于以下内容: 还感到惊讶吗?