未初始化的变量会发生什么? C++

问题描述:

int main() 
{  
    int a; 
    cout << a; 
    return 0; 
} 

我想知道为什么值0正在输出。我想如果一个变量未初始化,它会输出一个垃圾值。未初始化的变量会发生什么? C++

但是,我还记得听说整数的默认值是0,所以我有点困惑。

由于

+7

“0”与其他任何值一样都是垃圾值。你有_undefined behaviour_。这意味着您的程序将无法保证您的程序。 – paddy

+0

@paddy每次出现所有无数可能的值时都会获得0,就像每次玩游戏时都会赢得强力球一样,难道你不觉得有点腥吗? :) – zar

+0

@zar:不是。一些数字在计算机内存中比其他数字更常见,0是最常见的。 –

一个未初始化的功能范围的默认行为(即,本地)整数在C++是为它是indeterminate,这是细; 但是如果在定义之前使用该值,则会引入未定义的行为,并且可能发生任何事情 - demons could fly out of your nose

此网页的cppreference提供了默认整数行为的示例。另一方面,所有非本地线程局部变量,不只是整数,zero initialized。但是这个例子并没有包含在你原来的例子中。

(边注:一般认为很好的做法,只是反正一共初始化变量,并避免潜在的危险......特别是在global variables形式。)

有使用全局变量在极少数例外的最佳实践特殊情况,如一些嵌入式系统;它根据启动时的传感器读数初始化值,或者在初始循环迭代期间初始化值......并且需要在循环范围结束后保留​​一个值。

+0

这是否意味着当输出0时,这仍然是一个未定义的行为。还有什么是默认值,你什么时候看到它们在使用? – csguy

+0

是的,即使它是期望的行为,作为输出的0仍然是未定义的行为。没有默认值这样的东西。 – NonCreature0714

+0

随着你的帮助(ty)和更多的阅读后,我断定当未初始化时只有全局变量被设置为默认值,但是当未初始化时局部变量将包含任意值。这听起来正确吗? – csguy

我认为你是不相信与给出的答案/评论,可能是你可以试试下面的代码:

#include <iostream> 
using namespace std; 

int main(){ 

int a,b,c,d,e,f,g,h,i,j; 

cout<<a<<endl; 
cout<<b<<endl; 
cout<<c<<endl; 
cout<<d<<endl; 
cout<<e<<endl; 
cout<<f<<endl; 
cout<<g<<endl; 
cout<<h<<endl; 
cout<<i<<endl; 
cout<<j<<endl; 

return 0; 
} 
+0

有帮助ty – csguy

+0

有趣的是,我尝试过所有的bool值,它们都是0.这是否意味着某些数据类型有默认值?我认识到0是错误的,整数有更多可能的值 – csguy

+2

不要假设_undefined behavior_意味着结果是_random_。依赖未定义行为的程序可以产生一致的结果。事实上,这个答案是误导性的,因为它意味着运行程序会为未初始化的变量输出不同的值。它可能。它可能不会。 – jdigital

那么其原因是,一个变量获得垃圾值(值未知/毫无意义程序)是当某人运行一个程序时,它被加载到RAM的某个部分。现在,这一切都取决于以前设置到某个位置的值,可能是之前的其他一些程序。 这只是发生在你的程序已经加载到一个位置,它恰好是RAM中的0值,这就是你得到的回报。

这很有可能,如果重新启动系统并尝试运行相同的程序,那么你可能会得到垃圾值。

上述语句对于未由编译器初始化的变量有效。