代码一开头先声明下函数,之后再定义函数,为何定义函数的时候也需要写函数的返回类型?

代码一开头先声明下函数,之后再定义函数,为何定义函数的时候也需要写函数的返回类型?,第1张

1、不管之前有没有声明,定义的时候函数返回值类型都必须完整定义。比如你将来生一个小孩,他出生后浑身上下什么零件都必须长齐的。

2、前面声明,是为了使得编译器编译到调用这个函数的代码的时候,明白应该怎么匹配各个参数。就好比你孩子还没有到单位去工作,但必须有一张表格把你孩子的基本情况等等信息告知人家,人家才好提前考虑,将来当你孩子真正报到的时候,直接匹配已经安排好的工作即可。

赢天资讯资源社区。

不对,

void就是不需要

返回值

的函数。也就是说,调用一个函数,执行一个过程,但不一定要返回值。

不需要知道

这个函数执行有没有成功,只用来调用。所以,不对。即使,让你感觉void也是一个返回类型。

因为C语言在设计时是以效率优先的,因为数组可能很大,整体传递很花时间,所以不允许数组整体赋值,也不能返回数组,也不作为参数传递(数组作参数时实际是将它转化成了指针,这好像不符合值传递)。

不过如果确实需要返回数组,也是有办法的,可以将其包在结构中。

struct Test

{

int buf[10];

};

struct Test returnArray()

{

struct Test tt = { 1, 2, 3, 4, 5, 6, 7, 19, 54, 32 };

return tt;

}

int main()

{

struct Test t = returnArray();

for ( int i = 0; i < 10; ++i )

{

printf( "%d\t", tbuf[ i ] );

}

}

C++当然跟C一样。

你说C++中允许在字符串上进行整体 *** 作,那个string是一个类,不是数组。

c语言规定,函数返回值的类型是由函数首部定义的类型决定。函数返回值应与首部定义的类型一致,如若不一致,则自动将返回值强制转换为函数首部定义的类型。没有定义类型时默认为int型。

也就是说你的函数是什么类型,返回值就是什么类型。

比如:

函数定义 int fun(int a,char b)

返回值就是整型

函数定义 int fun(int a)

返回值就是基类型为整型的指针

函数定义 void fun(int a)

无返回值

扩展资料

函数可以有返回值,只要 return 就可以给出一个,不过常常不用它,有两个原因:

1、C/C++里返回值是复制出去的,而对于大的对象,复制的代价很高;

2、有些对象是不能复制的,至少编译器不知道怎么复制,比如数组。

于是有了下面这样的函数:

bool GetObj(ObjType& obj);

bool Encode(const char src, char dest);

用一个参数来代替返回值,而返回值只是指示函数执行是否成功。

返回一个大对象是困难的,但这个困难存在于 C 程序中,而不是 C++ 程序中。 C 函数里较少通过返回一个指针来返回对象,因为:

1、如果指针指向栈变量,毫无疑问,要么不用这个返回值,要么是一个错误;

2、如果指针指向堆变量,需要用这个函数的程序员会好好的看文档且足够细心会调用 free,要么就是内存泄漏;

3、如果指针指向 static 变量,那么用这个函数的程序员牢牢记住“下次调用这个函数以后,上次的返回值也会跟着变”。

在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);

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

函数可以有返回值,也可以没有返回值。对于没有返回值的函数,功能只是完成一个 *** 作,而不能返回运算的结果。对于没有返回值的函数,功能不仅是完成一个 *** 作,还能返回运算的结果,功能更加强大。

例如:

void funcplus(int a,int b)

{

    a+b;

}

int funcplusRet(int a,int b)

{

    retutn a+b;

}

如上所示:funcplus只完成了 a+b的运算,结果没有返回,所以我们得不到计算的结果。

funcplusRet,完成了a+b的运算,并且返回了结果,我们可以获得结果。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/11672136.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存