刚刚测试了一个程序,感觉很怪异,和我之前理解的不一样!
程序:
int& ABC()
{
int n = 5;
return n;
}
int _tmain(int argc, _TCHAR* argv[])
{
int n = ABC();
cout << n << endl;
}
假如是上面的程序,那么n的输出就是5,这里没有什么问题,因为在赋值的时候会进行复制操作。
但是:
int& ABC()
{
int n = 5;
return n;
}
int _tmain(int argc, _TCHAR* argv[])
{
int& n = ABC();
cout << n << endl;
}
将n的前面加上&运算符,返回结果还是5.这里就怪异了。因为我们是用引用接收的,也就是所谓的别名,所以这里的n值应该和ABC函数局部中的n的值一样,而局部中的n在函数调用结束后,就会释放其空间,成为垃圾值。这么这里为什么会造成这个问题呢?这就和C++的运行时结构有关了。
我试着说一说我的理解,不一定对!参考,如果不对,及时告知!
如上图所示,程序在内存中运行,首先进入主函数,然后有一个n变量,接收来自于函数ABC的返回值。如上程序,ABC中的返回值是局部变量n,为什么局部变量n返回给main函数中的n之后,main中的n也是5呢?因为在ABC函数
中局部变量销毁后,也就是ABC中的n销毁后,存放5的那个内存位置还在,而且那个地方的值目前还是5,并没有改变,因为你并没有调用别的函数,假如在调用了函数ABC之后,继续调用了一个其他函数,并且该函数中有入栈的
操作,比如有局部变量。则main函数中的n接收的值就不再是5.
测试程序如下:
float fn1(float r)
{
float temp;
temp = r*r*3.14;
return temp;
}
int& ABC()
{
int n = 5;
return n;
}
int _tmain(int argc, _TCHAR* argv[])
{
int &n = ABC();
fn1(10);//这里有入栈操作,改变了原来5位置的值。
cout << n << endl;}
太危险了,有这样的巧合存在。而且以后用引用要注意这一点!
在举一个例子,
float fn1(float r)
{
float temp;
temp = r*r*3.14;
return temp;
}
float& fn2(float r)
{
float temp;
temp = r*r*3.14;
return temp;
}
int& ABC()
{
int n = 5;
return n;
}
int _tmain(int argc, _TCHAR* argv[])
{
float a = fn1(5.0);
/*float& b = fn1(5.0);*/
float c = fn2(5.0);
float& d = fn2(5.0);
fn2(10);//如果将这句话屏蔽,那么a、b、c、d的值是一样的,都是78.5也是这个道理!!
float cc = d;
float &dd = c;
cout << a << " " << c << " " << d << " " << cc << endl;
}
感觉这个地方还是不太清楚,变值的过程是怎么变的,还是有点迷惑。如果我把fn2(10)变为ABC(),为什么是垃圾值了。按理说应该是5吧!应该是还有一些其他的处理,
把内存给改了吧!
随机数程序:
srand(time(NULL));
for (int i=0;i<5;i++)
{
cout << rand()%100 << endl;
}
记得加入头文件#include <ctime> #include <cstdlib>。加入srand的原因是每次都产生不同的随机数,time(NULL)是获得系统当前时间。如果不加入srand,rand产生的随机数称为伪随机数,何为伪随机数?如果不加入srand,每次产生的随机数是相同的。如果加入srand并以time(NULL)作为参数,
time(NULL)在此称之为随机种子。则产生的随机数每次都会不同。如果将srand的参数改为固定值。则每次产生的随机数又相同。
以上说法经过验证!!!!!!