未初始化的变量会发生什么? C++
int main()
{
int a;
cout << a;
return 0;
}
我想知道为什么值0正在输出。我想如果一个变量未初始化,它会输出一个垃圾值。未初始化的变量会发生什么? C++
但是,我还记得听说整数的默认值是0,所以我有点困惑。
由于
一个未初始化的功能范围的默认行为(即,本地)整数在C++是为它是indeterminate,这是细; 但是如果在定义之前使用该值,则会引入未定义的行为,并且可能发生任何事情 - demons could fly out of your nose。
此网页的cppreference提供了默认整数行为的示例。另一方面,所有非本地线程局部变量,不只是整数,是zero initialized。但是这个例子并没有包含在你原来的例子中。
(边注:一般认为很好的做法,只是反正一共初始化变量,并避免潜在的危险......特别是在global variables形式。)
有使用全局变量在极少数例外的最佳实践特殊情况,如一些嵌入式系统;它根据启动时的传感器读数初始化值,或者在初始循环迭代期间初始化值......并且需要在循环范围结束后保留一个值。
这是否意味着当输出0时,这仍然是一个未定义的行为。还有什么是默认值,你什么时候看到它们在使用? – csguy
是的,即使它是期望的行为,作为输出的0仍然是未定义的行为。没有默认值这样的东西。 – NonCreature0714
随着你的帮助(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;
}
那么其原因是,一个变量获得垃圾值(值未知/毫无意义程序)是当某人运行一个程序时,它被加载到RAM的某个部分。现在,这一切都取决于以前设置到某个位置的值,可能是之前的其他一些程序。 这只是发生在你的程序已经加载到一个位置,它恰好是RAM中的0值,这就是你得到的回报。
这很有可能,如果重新启动系统并尝试运行相同的程序,那么你可能会得到垃圾值。
上述语句对于未由编译器初始化的变量有效。
“0”与其他任何值一样都是垃圾值。你有_undefined behaviour_。这意味着您的程序将无法保证您的程序。 – paddy
@paddy每次出现所有无数可能的值时都会获得0,就像每次玩游戏时都会赢得强力球一样,难道你不觉得有点腥吗? :) – zar
@zar:不是。一些数字在计算机内存中比其他数字更常见,0是最常见的。 –