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

kot*_*API 5 c++ visual-studio-2010 visual-c++

#include <iostream>

using namespace std;

int weirdVariable = weirdVariable  + 1;
int main() {
  cout<< weirdVariable ;
  return weirdVariable ;
}
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*eld 5

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

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

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

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

  • @kotAPI未定义的行为并不意味着它是无效的C++.它是完全有效的C++,但是当你运行可执行文件时,任何事情都可能发生.一个好的编译器能够警告你,你可能遇到这种情况(因为我认为GCC,clang和VS都这样做). (2认同)