我正在编写一个简单的程序来测试变量的范围是如何工作的,但是我得到了意想不到的结果,所以我希望你能帮助我理解它们。 我编译了这段代码
#include<iostream>
using namespace std;
void myFunction1()
{
int e;
cout << e << endl;
e++;
cout << e << endl<<endl;
}
int main()
{
cout << "MAIN" << endl;
int a,b,c,d;
cout << "a= " << a << endl;
cout << "b= " << b << endl;
cout << "c= " << c << endl;
cout << "d= " << d << endl<<endl;
cout << "MY_FUNC" << endl;
myFunction1();
myFunction1();
myFunction1();
}
并获得此输出
MAIN
a= -1617852976
b= 32767
c= 0
d= 0
MY_FUNC
32675
32676
32676
32677
32677
32678
所以,有两件事我真的不明白
1)在main()函数中我创建了4个int变量(a,b,c,d)而没有初始化它们,所以我希望它们在每次运行代码时都假设一个不同的值。奇怪的是,第一个变量(a)总是不同,而其他变量总是假设相同的值(b = 32767,c = d = 0)
2)功能输出对我来说更奇怪。 同样,我正在创建一个变量e而不初始化它,所以它第一次假定一个随机值(在这个例子中,e = 32675).....然后,我把它增加一,所以它打印32675和32676,这听起来是正确的。
但是为什么第二次调用函数时,e保持前一个值(32676)?我认为每次调用myFunction1()时都会创建e并在函数末尾删除,因此e每次都假设一个不同的随机值(因为我没有初始化它)。即使变量超出范围,为什么存储e的值?
答案 0 :(得分:2)
未初始化的原始值根本没有定义。他们可以有任何价值。
答案 1 :(得分:2)
这是一种未定义的行为。这就是为什么分析这个程序的行为没有任何意义。
答案 2 :(得分:1)
在main()函数中我创建了4个int变量(a,b,c,d)而没有初始化它们,所以我希望它们在每次运行代码时都假定一个不同的值
这个假设是有缺陷的。每次运行代码时,可能具有不同的值,但它们可能不会。什么事情都可能发生。 UB的要点是你应该放弃所有你的假设。
但是为什么第二次调用函数时,e保持前一个值(32676)?我以为每次调用myFunction1()时都会创建e并在函数结束时删除,因此每次e都假设一个不同的随机值(因为我没有初始化它)
确实如此。如果你替换&#34;随机&#34;为了更正确&#34;任意&#34;,那么你看到的结果恰好符合这种模式。
这只是纯粹的运气,归结为你在程序执行的每个阶段都没有无人认领的记忆状态。
答案 3 :(得分:0)
帮助您理解这一点的好方法是从内存分配方面进行解释。
运行程序时,会为您的变量分配一定量的未使用的内存。
计算机是懒惰的,删除数据的最佳方法是忘记存储的位置。当您为变量分配一块内存时,您告诉计算机要记住某些数据所属的位置。
如果碰巧在将内存分配给变量之前使用它,它将简单地读取(让对于普通机器说4个字节)并从该位置获取数据。
希望这有助于=)