C++中函数返回值的问题与产生随机数

刚刚测试了一个程序,感觉很怪异,和我之前理解的不一样!

程序:

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的参数改为固定值。则每次产生的随机数又相同。

以上说法经过验证!!!!!!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值