问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

什么是函数的返回值

发布网友 发布时间:2022-05-07 00:50

我来回答

4个回答

热心网友 时间:2023-10-09 20:15

一个函数的函数名既是该函数的代表,也是一个变量。由于函数名变量通常用来把函数的处理结果数据带回给调用函数,即递归调用,所以一般把函数名变量称为返回值。

C++中编辑
函数可以有返回值,也可以没有返回值。对于没有返回值的函数,功能只是完成一个操作,应将返回值类型定义为void,函数体内可以没有return语句,当需要在程序指定位置退出时,可以在该处放置一个
例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

voidbackward(intn)
{
cout<<n%10;
if(n<10)return;
elsebackward(n/10);
}
intmain()
{
intn;
cout<<"输入整数:"<<endl;
cin>>n;
cout<<"原整数:"<<n<<endl<<"反向数:";
backward(n);
cout<<endl;
return0;
}

函数可以有返回值,只要 return 就可以给出一个。不过我们常常不用它--有两个原因:
1、C/C++里返回值是复制出去的,而对于大的对象,复制的代价很高;
2、有些对象是不能复制的--至少编译器不知道怎么复制--比如数组。
于是我们有了很多这样的函数:
bool GetObj(ObjType& obj);
bool Encode(const char* src, char* dest);
用一个参数来代替返回值,而返回值只是指示函数执行是否成功。我本人一直固执的认为,这是C的处理方式,C++不该这样,返回就是返回,就该光明正大的返回,而不是在文档里为某个参数悄悄的注上: // out
诚然返回一个大对象是困难的,但这个困难是 C 程序员的,而不是 C++ 程序员的 -- 我们可以返回指针。C也有指针,但很少有人敢在 C 函数里返回一个指针,因为:
1、如果指针指向栈变量,毫无疑问,要么你不用这个返回值,要么是一个错误;
2、如果指针指向堆变量,要么你在祈祷用这个函数的程序员会好好的看文档且足够细心会调用 free,要么就是内存泄漏;
3、如果指针指向 static 变量,那么用这个函数的程序员牢牢记住“下次调用这个函数以后,上次的返回值也会跟着变”,要么就是你被别人骂成“专出 BUG 的垃圾”。
在C++里直接返回裸指针的话,情况并不会有什么起色,不过 C++ 有智能指针的,通常它们指向堆变量,占用的空间和裸指针一样大。考虑前面第一个函数,我们写成:
std::auto_ptr<ObjType> GetObj();
那么一切迎刃而解,返回值如果你不要,作为临时变量,会立即被析构,返回的对象被释放;如果你要,就得赋值给另一个智能指针。总之不用程序员记得,编译器会保证这个对象的释放。
考虑第二个函数,稍微有一点麻烦,因为 auto_ptr 是不能用来持有数组的,不过,在C++的世界里,std::string 几乎总是比 char* 好用:
std::auto_ptr<std::string> Encode(const char* src);
最后考虑最麻烦的情况:
bool AssembleObjList(ObjType objList[], size_t length);
这种类型的函数无论是在 C标准库里,还是在各种操作系统的 API 里,比比皆是,事实上它存在两大缺陷:
1、如果需要的数量超出给出的,要么是一个安全问题(经典的缓冲区溢出,如 strcpy),要么是失败,程序员不得不作出估计--众所周知,程序员的估计能力比他们的薪水低得多;
2、如果执行成功,到底 Assemble 了多少个?
于是我们见到了这样的函数:
bool AssembleObjList(ObjType objLIst[], size_t* lengthPtr);
这个函数通常是两步调用的:
size_t length = 0;
AssembleObjList(0, &length);
ObjType* objList = new ObjType[length];
AssembleObjList(objList, &length);
for(size_t i=0; i<length; ++i)// 处理每个元素
这种形式能解决上面列出的两个问题,但这实在是太麻烦、太可恶了。我的答案仍然是--C++程序员应该用C++的库:
std::auto_ptr<std::vector<ObjType> > AssembleObjList();
又干净,又舒服!
C++标准库里居然没有一个可以持有数组的智能指针,所以 boost库不错,可以这样:
std::pair<boost::scoped_array<ObjType>, size_t> AssembleObjList();
可惜这个并不比标准库的解法更优秀--因为要返回数目的缘故,不过我个人更喜欢这个解,因为他更接近最优的解--传说中的 trule 手法:
TruleVector<ObjType> AssembleObjList();
其中 TruleVector是这样一个模板:它只有两种操作,一是构造,二是自动转型为 std::vector,而且它具有 “auto_ptr 式的所有权转移语义”。也就是说,TruleVector除了作为数组型的返回值,你无法把他用于其它任何任务。
不过由于 std::vector具有值语义,所以写的代码还是稍微有一点不同寻常:
typedef std::vector<ObjType> ObjListType;
ObjListType list;
list.swap(AssembleObjList());
最后一句在有的产品上可能要写成:
list.swap(static_cast<ObjListType>(AssembleObjList()));
这样别扭的原因,可以归咎于C++库里缺一个引用语义的线性容器。

php中编辑
值通过使用可选的返回语句返回。任何类型都可以返回,其中包括列表和对象。这导致函数立即结束它的运行,并且将控制权传递回它被调用的行。更多信息见 return()。
例子 17-11. return()的用法
<?php
function square($num)
{
return $num * $num;
}
echo square(4); // outputs '16'.
?>函数不能返回多个值,但为了获得简单的结果,可以返回一个列表。
例子 17-12. 返回一个数组以得到多个返回值
<?php
function small_numbers()
{
return array (0, 1, 2);
}
list ($zero, $one, $two) = small_numbers();
?>从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用操作符 & :
例子 17-13. 由函数返回一个引用
<?php
function &returns_reference()
{
return $someref;
}
$newref =& returns_reference();
?>

热心网友 时间:2023-10-09 20:15

程序执行完后会将一个数(或是其他类型的值)返回给这个函数(相当于这个函数最后储存了这个数,是这个数的代言人,呵呵)
举个列:
int A( ){
int a=2;
int b=4;
int c;
c=a+b;
return c;
}
主函数调用这个函数时:
void main( ){
cout<<A( );
}
就将return的那个值输出来了;
倘若没有return c这句,得出的结果不会输出来;
A()这个函数执行后什么也没得到,其只是执行了
一个加法问题,留下的是“空气”(呵呵)。

热心网友 时间:2023-10-09 20:16

函数的返回值其实很简单,你把函数看成一个具备某种功能的黑盒子,调用函数的时候,就相当于给它传入函数要求的数据,然后函数开始按它的功能运行,最后输出一个运行结果,这个输出的结果就是返回值。只是不同的函数实现不同的功能。
调用函数的时候传入的叫参数,传入的参数要严格的按函数的定义要求,如参数的类型。如果有多个参数还必须按每个参数的顺序来传入。
当然函数不一定要返回一个值,可以返回空值。

热心网友 时间:2023-10-09 20:16

解释:
一个函数的函数名既是该函数的代表,也是一个变量。由于函数名变量通常用来把函数的处理结果数据带回给调用函数,即递归调用,所以一般把函数名变量称为返回值。
相关简介:
函数可以有返回值,只要 return 就可以给出一个。不过人们常常不用它,有两个原因:
1、C/C++里返回值是复制出去的,而对于大的对象,复制的代价很高;
2、有些对象是不能复制的--至少编译器不知道怎么复制--比如数组。
于是有了很多这样的函数:
bool GetObj(ObjType& obj);
bool Encode(const char* src, char* dest);
用一个参数来代替返回值,而返回值只是指示函数执行是否成功。我本人一直固执的认为,这是C的处理方式,C++不该这样,返回就是返回,就该光明正大的返回,而不是在文档里为某个参数悄悄的注上: // out
诚然返回一个大对象是困难的,但这个困难是 C 程序员的,而不是 C++ 程序员的 -- 也可以返回指针。C也有指针,但很少有人敢在 C 函数里返回一个指针,因为:
1、如果指针指向栈变量,毫无疑问,要么不用这个返回值,要么是一个错误;
2、如果指针指向堆变量,要么在祈祷用这个函数的程序员会好好的看文档且足够细心会调用 free,要么就是内存泄漏;
3、如果指针指向 static 变量,那么用这个函数的程序员牢牢记住“下次调用这个函数以后,上次的返回值也会跟着变”,要么就是被别人骂成“专出 BUG 的垃圾”。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
说课包括哪些方面 说课内容包括()。 如何在手机百度上删除对话记录? 结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 什么叫函数有返回值?能用通俗的办法说明吗?本人菜鸟,聆听指教。 C语言中调用有返回值和无返回值函数有何区别? C语言中调用有返回值和无返回值函数有何区别?? 苹果手机进水不能开机和充电,维修要多少钱 苹果手机进水了充不了电维修费是多少 网购时留错电话号码,拿不到包裹怎么办 网购收货的电话填错,怎么办 网购的时候电话号码留错了怎么办,但发货已经在路上? etc个人中心提示升级固件,点击进入又显示卡片可继续使用,不需要续期。一退出又提示升级固件? 美味烧汁虾,怎么做好吃呢? reach toward什么意思 怎么看基带?基带是什么?我是小白。 reach后一定要加介词吗,加什么介词 通信系统中的基带信号和手机信息中显示的基带版本有什么关系?基带版本中的基带是什么意思?一个软件? because of,reach for是什么意思 手机的基带是什么,有什么用? reach作 够到 伸手去拿 之意时 是reach for sth 还是 reach sth? reach for 的具体用法 Reach for reach for 和reach to 的用法 有返回值函数和无返回值函数的区别 printf函数有没有返回值 c语言 有参有返回值函数 1..为什么要使用函数?2.函数分哪些类型3.函数的参数与返回值。 c语言怎么写一个有返回值的函数 在C语言中,怎样定义一个有返回值的调运函数,他与没有返回值的函数有什么区别 C语言中有参有返回值涵数 函数的返回类型有几种?它们的含义是什么? 如何判断一个函数是否有返回值? 创建Oracle中表空间,指定路径错误,原因? ...要先学网页三剑客吗?如果不需要的话,是学html+css还是html5+... 国内用html5 css3 开发的网站有哪些?京东是不是用HTML5+CSS3开发的? 一只火腿大约多少斤? 一只大点的宣威火腿多少斤 怎么做一个网站?现在只会用HTML5和css3做前端,特效找网上的代码,然后后 ... 假山假树制作技术 我梦见山路上全是玻璃渣渣的我脚上全是 梦见捞鱼脚底被两块玻璃划伤 梦见游泳脚被玻璃割到是什么意思 哪里有制作假树和人造景观植物的 轮胎怎么选择?