#include <iostream>
#include <math.h>
using namespace std ;
double& Sum(int iNum)
{
int iBase = 2 ;
int iTemp = 0 ;
double iSum = 0 ;
double& s = iSum ;
for (int i = 0; i < iNum; i ++)
{
iTemp = iTemp + iBase * pow(10, i) ;
iSum = iSum + iTemp ;
}
return s ;
}
void main()
{
int iNumber ;
double sum ;
cout < < "Please input the number of jishu: " < <endl ;
cin> > iNumber ;
sum = Sum(iNumber) ;
cout < < "The sum is: " < < sum < <endl ;
}
以上是我的代码,在vc6.0下通过(题目是求和 a+aa+aaa+aaaa+...)
我之前在effective c++上看见过这样的说法,不要返回局部变量的引用,因为栈上生成的局部变量在函数调用结束后会被析构掉,从而导致返回的引用指向一个不存在的变量(说法可能不太准确,但是我的意思就是这样),从而导致错误!
但是现在这个小代码可以编译通过并且得出正确结果(因为没考虑溢出,所以请输入小一点的数)
这到底是怎么回事情?
请高人指点一二,在线等待,谢谢!
能得到正确结果,不表明没有错误。
楼主的程序之所以能得到正确的结果,主要是因为这句sum = Sum(iNumber) ;,使返回的值已经转移到sum上。输出的sum也不是函数中的 iSum ,而是另外一个地方的相同值。
下面这处程序你就能看到返回的引用已经被覆盖的情况:
#include <iostream>
#include <math.h>
using namespace std ;
double& Sum(int iNum)
{
int iBase = 2 ;
int iTemp = 0 ;
double iSum = 0 ;
double& s = iSum ;
for (int i = 0; i < iNum; i ++)
{
iTemp = iTemp + iBase * pow(10, i) ;
iSum = iSum + iTemp ;
}
return s ;
}
void test()
{
int x=0,y=0,z=0,a=0,b=0,c=0;
}
void main()
{
int iNumber ;
cout < < "Please input the number of jishu: " < <endl ;
cin> > iNumber ;
double &sum = Sum(iNumber) ;//sum是局部变量的引用
test();//当另一个函数又展开栈时,将覆盖先前的函数栈上的数据
cout < < "The sum is: " < < sum < <endl ;//这里输出的也就不是正确结果了,而是0,如果注释掉上一行的test()调用,则可以得到正确结果,但仍然是属于过期数据,程序上中应该避免。
}