| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 838 人关注过本帖
标题:关于函数返回引用的问题
只看楼主 加入收藏
tao12345
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-9-1
结帖率:0
收藏
已结贴  问题点数:20 回复次数:11 
关于函数返回引用的问题
我刚接触C++,但是关于函数反馈一个引用老是不能够理解,函数返回的引用是谁的引用?
例如下面的这个程序,函数f返回了一个引用temp,那么temp是谁的引用?
#include "iostream"

int main()
{int i=5;
 int& f(int);
 int n=f(i);
 std::cout<<n<<std::endl;
    return 0;
}

int& f(int x)
{
    int temp;
    temp=x*x;
    return temp;
}
搜索更多相关主题的帖子: include 
2013-09-01 07:53
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:7 
未定义行为

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-09-01 15:15
tao12345
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-9-1
收藏
得分:0 
回复 2楼 peach5460
什么叫未定义行为?
这个程序是能够运行的,我想问的是,这个程序的子函数,返回的是temp值,而根据函数的定义,返回值是一个引用,即temp是个引用,那么temp是谁的引用?
2013-09-01 20:38
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:7 
知道“引用”是什么概念吗?

授人以渔,不授人以鱼。
2013-09-01 21:03
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
未定义行为:
在计算机编程中,未定义行为(英语:Undefined behavior)是指行为不可预测的计算机代码。这是一些编程语言的一个特点,最有名的是在C语言中。[1]在这些语言中,为了简化标准,并给予实现一定的灵活性,标准特别地规定某些操作的结果是未定义的,这意味着程序员不能预测会发生什么事。
例如,在C语言中,在任何自动变量被初始化之前使用这个变量会产生未定义的行为,除以零或访问数组定义的界限之外的元素(参见缓冲区溢出)也会产生未定义的行为。在一般情况下,之后的任何行为是不确定的。特别是,标准从来没有要求编译器判断未定义的行为,因此,如果程序调用未定义的行为,可能会成功编译,甚至一开始运行时没有错误,只会在另一个系统上,甚至是在另一个日期运行失败。当一个未定义行为的实例发生时,正如语言标准所说,“什么事情都可能发生”,也许什么都没有发生。

来自维基百科:http://zh.

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-09-02 11:13
l991160619
Rank: 1
等 级:新手上路
帖 子:4
专家分:7
注 册:2013-9-2
收藏
得分:7 
你引入了第三变量,返回的引用是temp自身的引用
2013-09-02 17:36
tao12345
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-9-1
收藏
得分:0 
回复 5楼 peach5460
谢谢,请教了其他的人,他们给我这样解释的,但是仍有疑问,请再帮我看看行吗?谢谢!

1 temp是子函数定义的一个临时变量,用来存储fun函数计算的结果;
2 实际上,函数在运行的时候,参加运算的参数是放在堆栈中的,(假如说这个运算是一个复杂的函数),每运行一次函数的原型结果会放在栈顶,该结果会成为下一步运算的一个因数,直到函数运行完毕;
3 2中最后一次运行的结果会放在堆栈中,程序会自动设定一个隐藏的临时变量表示,然后再将此临时变量传递给temp,temp实际是临时变量的引用;
4 但temp的结果返回到主函数以后,temp的内存(也即临时变量的栈中的内存)将会被释放,但是如果按照这种解释,下面的程序又解释不了?

#include "iostream"

int main()
{   int n=2;
    int f(int);
    f(n);
    std::cout<<f(n)<<std::endl;
    return 0;

}

int f(int i)
{
    int temp;
    temp=i*i;
    std::cout<<&temp<<std::endl;
    return temp;
}

运行结果为:
0012FF20
0012FF1C
4
2013-09-02 19:35
tao12345
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-9-1
收藏
得分:0 
回复 4楼 TonyDeng
高手,那你帮忙看一下下面的程序的运行结果为什么这么奇怪?我要输出temp的地址值,但是为什么输出了两个地址值?请问是为什么?

#include "iostream"

int main()
{   int n=2;
    int f(int);
    f(n);
    std::cout<<f(n)<<std::endl;
    return 0;

}

int f(int i)
{
    int temp;
    temp=i*i;
    std::cout<<&temp<<std::endl;
    return temp;
}

运行结果为:
0012FF20
0012FF1C
4
2013-09-02 19:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
1.你得到的解释是对的;
2.之所以输出了两个地址值,是因为你调用了2次f()函数。

程序代码:
#include "iostream"

int main()
{   int n=2;
    int f(int);
    f(n);                            // 第1次调用
    std::cout<<f(n)<<std::endl;      // 第2次调用
    return 0;

}

int f(int i)
{
    int temp;
    temp=i*i;
    std::cout<<&temp<<std::endl;
    return temp;
}


[ 本帖最后由 TonyDeng 于 2013-9-2 19:57 编辑 ]

授人以渔,不授人以鱼。
2013-09-02 19:51
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
两次地址不同,是很正常的,不要幻想函数中的局部变量总在同样的地址上储存,那其实是随机的,也不由程序自己控制。系统只保管住你在函数中声明为static型的变量的空间,所有auto型的变量空间都会随着函数的终结而释放并被重新分配,每次运行在同样地址上的几率几乎为零。比如你上面的代码连续两次调用f(n),即把那行重复一次,就看到两个相同的地址值,但只要两行的代码不完全相同,有其他副行为,都难以得到这种机会。写程序不要把效果寄托在这种假定上,也不需要过分关心这些东西,无益的。

授人以渔,不授人以鱼。
2013-09-02 20:12
快速回复:关于函数返回引用的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017099 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved