#include <iostream>
using namespace std;
int weirdVariable = weirdVariable + 1;
int main() {
cout<< weirdVariable ;
return weirdVariable ;
}
我只是想知道这个未初始化的变量是如何不返回错误并返回1.所以我的问题是,如何/为什么它返回值“1”。这个程序在逻辑上是否有效?还是有些瑕疵?
答案 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 全局的局部变量,您可能会跳过初始化但会产生未定义的行为。不要真的依赖它。