未初始化的变量初始化:C 中的悖论
在 C 中,仅通过自身初始化新变量被认为是有效的,这似乎违反直觉。为了理解这个概念,让我们分析以下代码片段:
<code class="cpp">int a = 3; { int a = a; // Initializing 'a' with itself cout << "new a = " << a << "\n"; a = 5; cout << "a = " << a << "\n"; } cout << "old a = " << a << "\n";</code>
乍一看,人们可能会认为代码片段应该打印:
a=3 new a = 3 changed a = 5 old a = 3
但是,第二行通常返回“新的a = 0。”要理解为什么会发生这种情况,必须深入研究 C 中变量初始化的复杂性。
语法上,代码是有效的,因为 'a' 的声明先于其在内部作用域内的初始化。在 C 中,变量的名称在声明后甚至在为其分配任何值之前就可用。这允许自引用初始化,例如代码片段中使用的初始化。
但是,从行为的角度来看,使用未初始化的变量会导致未定义的行为。编译器可能会发出警告,但由于分析变量初始化的程序流程的复杂性,它们没有义务标记此类事件。
在代码片段中,'a' 在外部范围内用 3 初始化。当进入内部作用域时,将声明一个新的“a”,其名称与外部作用域变量的名称相同。然后,这个内部“a”被自初始化,这导致其值未定义。将 5 分配给内部作用域内的内部 'a' 不会影响外部 'a'。
因此,虽然单独初始化变量在语法上是有效的,但应谨慎使用,因为它可能会导致未定义的行为。
以上是为什么用自身初始化变量会导致 C 中未定义的行为?的详细内容。更多信息请关注PHP中文网其他相关文章!