为什么在返回未初始化的变量时编译器不会出错?

时间:2014-01-24 09:13:13

标签: c++ visual-studio-2010 visual-c++

#include <iostream>

using namespace std;

int weirdVariable = weirdVariable  + 1;
int main() {
  cout<< weirdVariable ;
  return weirdVariable ;
}

我只是想知道这个未初始化的变量是如何不返回错误并返回1.所以我的问题是,如何/为什么它返回值“1”。这个程序在逻辑上是否有效?还是有些瑕疵?

2 个答案:

答案 0 :(得分:5)

这不是未初始化的。具有静态存储持续时间的变量(如全局变量)在进一步初始化之前首先进行零初始化。因此weirdVariable最终会得到值1.

  

§3.6.2[basic.start.init] 具有静态存储持续时间(3.7.1)或线程存储持续时间(3.7.2)的变量应在任何之前进行零初始化(8.5)其他初始化发生。

如果您要将wierdVariable声明为main的本地,那么它将是未初始化的。这将为您提供未定义的行为,因为对未初始化的对象执行左值到右值的转换(读取:使用值)会给出未定义的行为。

  

§4.1[conv.lval] 如果glvalue引用的对象未初始化,则为程序   这需要这种转换具有不确定的行为。

答案 1 :(得分:4)

默认情况下,静态和全局变量初始化为0,因此它非常正常

C标准ISO/IEC 9899:1999 a.k.a. C99(和C ++)标准说这必须如此。有关确切文字(WG14 N1256

,请参见https://stackoverflow.com/a/1294780/1938163的第6.7.8节(&#34;初始化&#34;)中的第10项

顺便说一句:最好初始化静态变量,也只是为了让代码更具可读性!

static int myvar = 0;

不初始化它们的另一个缺点:如果编译器没有遵循标准,你可能会遇到麻烦

对于 NOT 静态和 NOT 全局的局部变量,您可能会跳过初始化但会产生未定义的行为。不要真的依赖它。