函数的返回类型有几种?它们的含义是啥?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数的返回类型有几种?它们的含义是啥?相关的知识,希望对你有一定的参考价值。
急急急!!!!我是一个一点也不懂C++的人,年纪大了,应付考试,请大家帮忙,不要说的太复杂了,简单明了即可,这是问答题。多谢各位高手!!
函数的结果被称为返回值,返问值的类型被称为函数返回类型。函数返回类型可以是预定义类型(如int 或double)、复合类型(如int&或double*)、用户定义类型(如枚举类或void 后者意指函数不返回值)
------------------------------------------------
具体请看:函数
1、概述
一般来说,函数由一个名字来表示。函数的操作数称为参数,由一个位于括号中、并且用逗号分隔的参数表指定。函数的结果被称为返回值,返问值的类型被称为函数返回类型。不产生值的函数返回类型是void,意思是什么都不返回。函数执行的动作在函数体中指定。函数体包含在花括号中,有时也称为函数块。函数返回类型、以及其后的函数名、参数表和函数体构成了函数定义
当函数名后面紧跟着调用操作符时,这个函数就被执行了。如果函数被定义为应该接收参数,则在调用这个函数时,就需要为这些参数提供实参。且这些实参被放在调用操作符中,而两个相邻的实参用逗号分隔。这种安排称为“向函数传递参数”
函数调用会导致两件事情发生。如果函数已经被声明为inline,则函数体可能已经在编译期间它的调用点上就被展开。如果没有被声明为inline,则函数在运行时才被调用。函数调用会使程序控制权被传送给正在被调用的函数,而当前活动函数的执行被挂起。当被调用的函数完成时,主调函数在调用语句之后的语句上恢复执行。函数在执行完函数体的最后一条语句或遇到返回语句后完成
我们必须在调用函数之前就声明该函数,否则会引起编译错误。当然,函数定义也可以被用作声明。但是,函数在程序中只能被定义一次。典型情况下函数定义被放在单独的程序文本文件中,或者与其他相关的函数定义放在同一个文本文件中。要想在其他文件而不是包含函数定义的文件中使用该函数,我们必须要用到另外一种函数声明机制
函数声明由函数返回类型、函数名和参数表构成。这三个元素被称为函数声明或函数原型,一个函数可在一个文件中被声明多次。
函数声明描述了函数的接口,它描述了函数必须接收的信息类型,以及它返回的信息类型返回类型,如果存在返回值的话。
2、函数原型
函数原型由函数返回类型、函数名以及参数表构成。函数原型描述的是函数的接口,它详细描述了调用函数时需要提供的参数的类型和个数,以及函数返回值的类型
2.1、函数返回类型
函数返回类型可以是预定义类型(如int 或double)、复合类型(如int&或double*)、用户定义类型(如枚举类或void 后者意指函数不返回值)
函数类型和内置数组类型不能作为返回类型
但是,类类型和容器类型可以被直接返回(这种方式效率比较低)
在C++标准化之前,如果缺少显式返回类型的话,返回值会被假定为int类型。在标准C++中,返回类型不能被省略
2.2、函数参数表
函数的参数表不能省略,没有任何参数的函数可以用空参数表或含有单个关键字void 的参数表来表示。
参数表中不能出现同名的参数,函数定义的参数表中的参数名允许在函数体中访问这个参数。函数声明中的参数名不是必需的,如果名字存在的话,它应该被用作辅助文档
2.3、参数类型检查
函数的参数表为编译器提供了必需的信息,使它能够在函数调用时对给出的实参进行类型检查
C++是一种强类型语言,每个函数调用的实参在编译期间都要经过类型检查。若实参类型与相应的参数类型不匹配,如果有可能,就会应用一个隐式的类型转换。如果不可能进行隐式转换或者实参的个数不正确,就会产生一个编译错误。这就是函数必须先被声明才能被使用的原因。编译器必须根据函数参数表,对函数凋用的实参执行类型检查,就此而言,声明是必不可少的
3、参数传递
所有的函数都使用在程序运行栈中分配的存储区。该存储区一直保持与该函数相关联,直到函数结束为止。那时,存储区将自动释放以便重新使用。该函数的整个存储区被称为活动记录
系统在函数的活动记录中为函数的每个参数都提供了存储区,参数的存储长度由它的类型来决定。参数传递是指用函数调用的实参值来初始化函数参数存储区的过程
C++中参数传递的缺省初始化方法是把实参的值拷贝到参数的存储区中,这被称为按值
传递。
按值传递时,函数不会访问当前调用的实参。函数处理的值是它本地的拷贝这些拷贝,被存储在运行栈中,因此改变这些值不会影响实参的值。一旦函数结束了,函数的活动记录将从栈中弹出,这些局部值也就消失了
在按值传递的情况下,实参的内容没有被改变。这意味着程序员在函数调用时无需保存和恢复实参的值。如果没有按值传递机制,那么每个没有被声明为const 的参数就可能会随每次函数调用而被改变。按值传递的危害最小,需要用户做的工作也最少。毫无疑问,按值传递是参数传递合理的缺省机制
按值传递并不是在所有的情况下都适合。不适合的情况包括:
(1)当大型的类对象必须作为参数传递时,对实际的应用程序而言,分配对象并拷贝到栈中的时间和空间开销往往过大
(2)当实参的值必须被修改时
3.1、引用参数
把参数声明成引用,实际上改变了缺省的按值传递参数的传递机制。在按值传递时,函数操纵的是实参的本地拷贝。当参数是引用时,函数接收的是实参的左值而不是值的拷贝。这意味着函数知道实参在内存中的位置,因而能够改变它的值或取它的地址
何时应该将一个参数指定为引用参数:
(1)被调用函数改变实参的值时
(2)向主调函数返回额外的结果
(3)向函数传递大型类对象
在按值传递情况下,整个对象将随每次调用而被拷贝。尽管按值传递对内置数据类型的对象和小型类对象比较满意,但是对于大型类对象,它的效率就太低了。使用引用参数,函数可以访问被指定为实参的类对象,而不必在函数的活动记录中拷贝它
如果引用参数不希望在被调用的函数内部被修改,那么把参数声明为const 型的引用是个不错的办法。这种方式能够使编译器防止无意的改变
3.2、引用和指针参数的关系
引用必须被初始化为指向一个对象,一旦初始化了,它就不能再指向其他对象。指针可以指向一系列不同的对象,也可以什么都不指向。
因为指针可能指向一个对象或没有任何对象,所以函数在确定指针实际指向一个有效的对象之前不能安全地解引用一个指针
另一方面,对于引用参数函数,不需要保证它指向一个对象。引用必须指向一个对象,甚至在我们不希望这样时也是如此
如果一个参数可能在函数中指向不同的对象,或者这个参数可能不指向任何对象,则必须使用指针参数
引用参数的一个重要用法是,它允许我们在有效地实现重载操作符的同时,还能保证用法的直观性
3.3、数组参数
在C++中,数组永远不会按值传递。它是传递第一个元素的指针
例如,如下声明:
void putValues( int[ 10 ] );
被编译器视为:
void putValues( int* );
数组的长度与参数声明无关
因为数组被传递为指针,所以这对程序员有两个含义:
(1)在被调函数内对参数数组的改变将被应用到数组实参上而不是本地拷贝上
(2)数组长度不是参数类型的一部分
另外一种机制是将参数声明为数组的引用。当参数是一个数组类型的引用时,数组长度成为参数和实参类型的一部分,编译器检查数组实参的长度与在函数参数类型中指定的长度是否匹配。例如:
void putValues( int (&arr)[10] );
int main()
int i, j[ 2 ];
putValues( i ); // 错误: 实参不是 10 个 int 的数组
putValues( j ); // 错误: 实参不是 10 个 int 的数组
return 0;
参数也可以是多维数组,这样的参数必须指明第一维以外的所有维的长度。例如:
void putValues( int matrix[][10], int rowSize );
把matrix 声明成一个二维数组,每行由10 个列元素构成。matrix可以被等价地声明为
int (*matrix)[10]
3.4、抽象容器类型参数
容器类型实际上是类类型,它比内置数组数据类型提供了更多的功能
当容器类型的参数按值传递时,容器以及全部元素都被拷贝到被调函数的本地拷贝中。因为拷贝的效率非常低,所以把容器类型的参数声明为引用参数比较好。
当一个函数不会修改参数的值时,我们把参数声明为const 类型的引用更为合适
3.5、缺省实参
函数可以用参数表中的初始化语法为一个或多个参数指定缺省实参
调用包含缺省实参的,函数时我们可以(也可以不)为该参数提供实参。如果提供了实参,则它将覆盖缺省的实参值。否则函数将使用缺省实参值
设计带有缺省实参函数的部分工作就是排列参数表中的参数,使最可能取用户指定值的参数先出现,而最可能使用缺省实参的参数出现在后面
一个参数只能在一个文件中被指定一次缺省实参
习惯上,缺省实参在公共头文件包含的函数声明中指定,而不是在函数定义中。如果缺省实参在函数定义的参数表中提供,则缺省实参只能用在包含该函数定义的文本文件的函数调用中
3.6、省略号
有时候我们无法列出传递给函数的所有实参的类型和数目。在这种情况下,我们可以用省略号... 指定函数参数表
省略号挂起类型检查机制。它们的出现告知编译器,当函数被调用时,可以有0 个或多个实参,而实参的类型未知。省略号有下列两种形式:
void foo( parm_list, ... );
void foo( ... );
第一种形式为特定数目的函数参数提供了声明。在这种情况下,当函数被调用时,对于与显式声明的参数相对应的实参进行类型检查,而对于与省略号对应的实参则挂起类型检查。在第一种形式中参数声明后面的逗号是可选的
4、返回一个值
return 语句被放在函数体内,这条语句结束当前正在执行的函数。在程序执行期间遇到return 语句时,程序控制权被返回给调用此函数的函数。
一个具有返回值的函数(即函数返回类型没有被声明为void)必须返回一个值,缺少返回值将引起编译错误
如果被返回的值的类型与函数返回类型不匹配,那么如果可能的话将应用隐式类型转换。如果无法隐式转换,则产生一个编译错误
缺省情况下函数的返回值是按值传递的,这意味着得到控制权的函数将接收返回语句中指定的表达式的拷贝。该缺省行为可以被改变,一个函数可以被声明为返回一个指针或一个引用
当声明一个返回引用的函数时,程序员应当知道下面两个易犯的错误:
(1)返回一个指向局部对象的引用。局部对象的生命期随函数的结束而结束。在函数结束后,该引用变成未定义内存的别名
(2)函数返回一个左值,对返回值的任何修改都将改变被返回的实际对象
4.1、参数和返回值与全局对象
一个程序中的各种函数可以通过两种机制进行通信。一种方法是使用全局对象,另一种方法是使用函数参数表和返回值
全局对象被定义在函数定义之外
5、递归
直接或间接调用自己的函数被称为递归函数
由于与函数调用相关的额外开销,递归函数可能比非递归数执行得慢一些。但是递归函数可能更小且更易于理解
6、内联函数
调用函数必须拷贝实参,保存机器的寄存器,程序还必须转向一个新位置
若一个函数被指定为inline函数,则它将在程序中每个调用点上被内联地展开
7、main():处理命令行
通常,在执行程序时,我们会传递命令行选项。例如,我们可能写如下命令行:
prog -d -o ofile data0
实际上,命令行选项是main()的实参。在main()函数中,我们可以通过一个名为argv 的C 风格字符串数组访问它
int main( int argc, char *argv[] ) ...
argc包含命令行选项的个数,argv包含aygc个C风格字符串,代表了由空格分隔的命令选项
8、指向函数的指针
8.1、指向函数的指针的类型
函数返回类型和参数表的不同组合,代表了各不相同的函数类型
int printf( const char*, ... );
int strlen( const char* );
int (*pfce)( const char*, ... ); // 可以指向 printf()
int (*pfc)( const char* ); // 可以指向 strlen()
8.2、初始化和赋值
不带下标操作符的数组名会被解释成指向首元素的指针。当一个函数名没有被调用操作符修饰时,会被解释成指向该类型函数的指针。例如,表达式:
lexicoCompare;
被解释成类型
int (*)( const string &, const string & );
的指针
将取地址操作符作用在函数名上也能产生指向该函数类型的指针。因此lexicoCompare和&lexioCompare 类型相同
指向函数的指针可以如下被赋值:
pfi = lexicoCompare;
pfi2 = pfi;
只有当赋值操作符左边指针的参数表和返回类型与右边函数或指针的参数表和返回类型完全匹配时,初始化和赋值才是正确的。如果不匹配,则将产生编译错误消息。在指向函数类型的指针之间不存在隐式类型转换
函数指针可以用0 来初始化或赋值,以表示该指针不指向任何函数
8.3、调用
指向函数的指针可以被用来调用它所指向的函数。调用函数时,不需要解引用操作符。无论是用函数名直接调用函数,还是用指针间接调用函数,两者的写法是一样的
也可以用显式的指针符号写出
(*pf)( ia, iaSize );
这两种形式产生相同的结果,但是第二种形式让读者更清楚该调用是通过函数指针执行的
8.4、函数指针的数组
// typedefs 使声明更易读
typedef int (*PFV)(); // 定义函数类型指针的typedef
PFV testCases[10];
8.5、参数和返回类型
函数参数的类型不能是函数类型,函数类型的参数将被自动转换成该函数类型的指针。例如:
// typedef 表示一个函数类型
typedef int functype( const string &, const string & );
void sort( string *, string *, functype );
编译器把sort()当作已经声明为
void sort( string *, string *,
int (*)( const string &, const string & ) );
除了用作参数类型之外,函数指针也可以被用作函数返回值的类型。例如:
int (*ff( int ))( int*, int );
函数不能声明返回一个函数类型,如果是则产生编译错误 参考技术A 函数返回类型可以是预定义类型(如int 或double)、复合类型(如int&或double*)、用户定义类型(如枚举类或void 后者意指函数不返回值)
函数(function),名称出自数学家李善兰的著作《代数学》。之所以如此翻译,他给出的原因是“凡此变数中函彼变数者,则此为彼之函数”,也即函数指一个量随着另一个量的变化而变化,或者说一个量中包含另一个量。
谁说一下c语言中return总有几种用法,并且说一下枚举的用法,尽量列下例子,详细一点说明。
说的好的话会加分的。
return 表示从被调函数返回到主调函数继续执行,返回时可附带一个返回值,由return后面的参数指定。 return通常是必要的,因为函数调用的时候计算结果通常是通过返回值带出的。 如果函数执行不需要返回计算结果,也经常需要返回一个状态码来表示函数执行的顺利与否(-1和0就是最常用的状态码),主调函数可以通过返回值判断被调函数的执行情况。 如果实在不需要函数返回什么值,就需要用void声明其类型。 补充:如果你函数名前有返回类型定义,如int,double等就必须有返回值,而如果是void型,则可以不写return,但这时即使写了也无法返回数值的 例如: 1.非void型 int f1() int i=1; return 1; //return(i); //这样也可以 2.void型 void f2() int i=1; //return;//这样也可以,不要这一句也可以 有时即使被调用函数是void类型 被调函数中的return也不是毫无意义的 举例: #include "stdio.h" void function() printf("111111"); return; printf("222222"); main() function(); 运行结果为:屏幕上只输出一串数字1 而没有2。 但是如果去掉function函数中的return语句 就可以同时输出一串数字2 这里的return其实还有个退出该程序的作用!也就是说在printf("111111");后面加了个return,就表示结束该函数,返回主函数中去了![编辑本段]2.
关于C语言中return的一些总结 return是C++预定义的语句,它提供了种植函数执行的一种放大。当return语句提供了一个值时,这个值就成为函数的返回值. 说到return,有必要提及主函数的定义,下面是从网络上找到的资料,好好消化吧,对了解主函数中返回值的理解有很大的帮助. 很多人甚至市面上的一些书籍,都使用了void main( ) ,其实这是错误的。C/C++ 中从来没有定义过void main( ) 。C++ 之父 Bjarne Stroustrup 在他的主页上的 FAQ 中明确地写着 The definition void main( ) /* ... */ is not and never has been C++, nor has it even been C.( void main( ) 从来就不存在于 C++ 或者 C )。下面我分别说一下 C 和 C++ 标准中对 main 函数的定义。 1. C 在 C89 中,main( ) 是可以接受的。Brian W. Kernighan 和 Dennis M. Ritchie 的经典巨著 The C programming Language 2e(《C 程序设计语言第二版》)用的就是 main( )。不过在最新的 C99 标准中,只有以下两种定义方式是正确的: int main( void ) int main( int argc, char *argv[] ) (参考资料:ISO/IEC 9899:1999 (E) Programming languages — C 5.1.2.2.1 Program startup) 当然,我们也可以做一点小小的改动。例如:char *argv[] 可以写成 char **argv;argv 和 argc 可以改成别的变量名(如 intval 和 charval),不过一定要符合变量的命名规则。 如果不需要从命令行中获取参数,请用int main(void) ;否则请用int main( int argc, char *argv[] ) 。 main 函数的返回值类型必须是 int ,这样返回值才能传递给程序的激活者(如操作系统)。 如果 main 函数的最后没有写 return 语句的话,C99 规定编译器要自动在生成的目标文件中(如 exe 文件)加入return 0; ,表示程序正常退出。不过,我还是建议你最好在main函数的最后加上return 语句,虽然没有这个必要,但这是一个好的习惯。注意,vc6不会在目标文件中加入return 0; ,大概是因为 vc6 是 98 年的产品,所以才不支持这个特性。现在明白我为什么建议你最好加上 return 语句了吧!不过,gcc3.2(Linux 下的 C 编译器)会在生成的目标文件中加入 return 0; 。 2. C++ C++98 中定义了如下两种 main 函数的定义方式: int main( ) int main( int argc, char *argv[] ) (参考资料:ISO/IEC 14882(1998-9-01)Programming languages — C++ 3.6 Start and termination) int main( ) 等同于 C99 中的 int main( void ) ;int main( int argc, char *argv[] ) 的用法也和 C99 中定义的一样。同样,main 函数的返回值类型也必须是int。如果main函数的末尾没写return语句,C++98 规定编译器要自动在生成的目标文件中加入 return 0; 。同样,vc6 也不支持这个特性,但是 g++3.2(Linux 下的 C++ 编译器)支持。 3. 关于 void main 在 C 和 C++ 中,不接收任何参数也不返回任何信息的函数原型为“void foo(void);”。可能正是因为这个,所以很多人都误认为如果不需要程序返回值时可以把main函数定义成void main(void) 。然而这是错误的!main 函数的返回值应该定义为 int 类型,C 和 C++ 标准中都是这样规定的。虽然在一些编译器中,void main 可以通过编译(如 vc6),但并非所有编译器都支持 void main ,因为标准中从来没有定义过 void main 。g++3.2 中如果 main 函数的返回值不是 int 类型,就根本通不过编译。而 gcc3.2 则会发出警告。所以,如果你想你的程序拥有很好的可移植性,请一定要用 int main 。 4. 返回值的作用 main 函数的返回值用于说明程序的退出状态。如果返回 0,则代表程序正常退出,否则代表程序异常退出。下面我们在 winxp 环境下做一个小实验。首先编译下面的程序: int main( void ) return 0; 然后打开附件里的“命令提示符”,在命令行里运行刚才编译好的可执行文件,然后输入“echo %ERRORLEVEL%”,回车,就可以看到程序的返回值为 0 。假设刚才编译好的文件是 a.exe ,如果输入“a && dir”,则会列出当前目录下的文件夹和文件。但是如果改成“return -1”,或者别的非 0 值,重新编译后输入“a && dir”,则 dir 不会执行。因为 && 的含义是:如果 && 前面的程序正常退出,则继续执行 && 后面的程序,否则不执行。也就是说,利用程序的返回值,我们可以控制要不要执行下一个程序。这就是 int main 的好处。如果你有兴趣,也可以把 main 函数的返回值类型改成非 int 类型(如 float),重新编译后执行“a && dir”,看看会出现什么情况,想想为什么会出现那样的情况。顺便提一下,如果输入 a || dir 的话,则表示如果 a 异常退出,则执行 dir 。 5. 那么 intmain(intargc,char*argv[],char*envp[])呢? 这当然也不是标准 C 里面定义的东西!char*envp[] 是某些编译器提供的扩展功能,用于获取系统的环境变量。因为不是标准,所以并非所有编译器都支持,故而移植性差,不推荐使用。 到了这里,你应该了解为什么主函数定义为 int返回类型,而且函数体里面有return 0;这个语句了吧. 下面具体说说我对return的应用的理解。 只要一个函数的返回值是数字型的,那么就可以返回0(即return 0),其实你返回多少都没问题。一般情况下,C++做出来的函数都要求返回一个值,当函数执行正常,且达到了一般情况下的目的,那么就返回0表示正确的调用了该函数,这个0就是返回给主调函数以通知没有出错的;如果函数调用中出错,或者没有按照一般情况执行,那么就返回1,以告知主调函数采取响应策略;如果你在某个函数所在类的定义所在的头文件中定义了一组状态值(一般都是负整数),那么函数就可以返回不同的值以告之主调函数具体发生了什么异常或错误,这种情况一般用于函数功能独立性较差的的情况。所以一般不鼓励把函数返回类型定义为void,至少返回应该是int,而在函数的最后加上return 0.语句: int func(参数列表) …… …… …… Return 0; 在函数中,如果碰到return 语句,那么程序就会返回调用该函数的下一条语句执行,也就是说跳出函数的执行,回到原来的地方继续执行下去。但是如果是在主函数中碰到return语句,那么整个程序就会停止,退出程序的执行。 如果你定义一个函数有返回类型,可以想下面那样调用: int func() int value; …… …… …… return value; int main() int intvalue; intvalue=func(); …… …… return 0; return语句后面具体是什么内容,这就要具体情况具体分析了: (1) 在返回类型是char的函数中,return后应该是char类型的值; (2) 在返回类型是int的函数中,如果是要停止函数的调用,最好应该为0;其他的按照你的目的而定,只要是int 类型就行了 (3) 在返回类型是结构类型的函数中,return后应该是结构的一个实例对象。 总之,函数定义为什么样的返回类型,该函数中return后就应该是相应类型的值。 参考技术A 关于C语言中return的一些总结
return是C++预定义的语句,它提供了种植函数执行的一种放大。当return语句提供了一个值时,这个值就成为函数的返回值.
说到return,有必要提及主函数的定义,下面是从网络上找到的资料,好好消化吧,对了解主函数中返回值的理解有很大的帮助.
很多人甚至市面上的一些书籍,都使用了void main( ) ,其实这是错误的。C/C++ 中从来没有定义过void main( ) 。C++ 之父 Bjarne Stroustrup 在他的主页上的 FAQ 中明确地写着 The definition void main( ) /* ... */ is not and never has been C++, nor has it even been C.( void main( ) 从来就不存在于 C++ 或者 C )。下面我分别说一下 C 和 C++ 标准中对 main 函数的定义。
1. C
在 C89 中,main( ) 是可以接受的。Brian W. Kernighan 和 Dennis M. Ritchie 的经典巨著 The C programming Language 2e(《C 程序设计语言第二版》)用的就是 main( )。不过在最新的 C99 标准中,只有以下两种定义方式是正确的:
int main( void )
int main( int argc, char *argv[] )
(参考资料:ISO/IEC 9899:1999 (E) Programming languages — C 5.1.2.2.1 Program startup)
当然,我们也可以做一点小小的改动。例如:char *argv[] 可以写成 char **argv;argv 和 argc 可以改成别的变量名(如 intval 和 charval),不过一定要符合变量的命名规则。
如果不需要从命令行中获取参数,请用int main(void) ;否则请用int main( int argc, char *argv[] ) 。
main 函数的返回值类型必须是 int ,这样返回值才能传递给程序的激活者(如操作系统)。
如果 main 函数的最后没有写 return 语句的话,C99 规定编译器要自动在生成的目标文件中(如 exe 文件)加入return 0; ,表示程序正常退出。不过,我还是建议你最好在main函数的最后加上return 语句,虽然没有这个必要,但这是一个好的习惯。注意,vc6不会在目标文件中加入return 0; ,大概是因为 vc6 是 98 年的产品,所以才不支持这个特性。现在明白我为什么建议你最好加上 return 语句了吧!不过,gcc3.2(Linux 下的 C 编译器)会在生成的目标文件中加入 return 0; 。
2. C++
C++98 中定义了如下两种 main 函数的定义方式:
int main( )
int main( int argc, char *argv[] )
(参考资料:ISO/IEC 14882(1998-9-01)Programming languages — C++ 3.6 Start and termination)
int main( ) 等同于 C99 中的 int main( void ) ;int main( int argc, char *argv[] ) 的用法也和 C99 中定义的一样。同样,main 函数的返回值类型也必须是int。如果main函数的末尾没写return语句,C++98 规定编译器要自动在生成的目标文件中加入 return 0; 。同样,vc6 也不支持这个特性,但是 g++3.2(Linux 下的 C++ 编译器)支持。
3. 关于 void main
在 C 和 C++ 中,不接收任何参数也不返回任何信息的函数原型为“void foo(void);”。可能正是因为这个,所以很多人都误认为如果不需要程序返回值时可以把main函数定义成void main(void) 。然而这是错误的!main 函数的返回值应该定义为 int 类型,C 和 C++ 标准中都是这样规定的。虽然在一些编译器中,void main 可以通过编译(如 vc6),但并非所有编译器都支持 void main ,因为标准中从来没有定义过 void main 。g++3.2 中如果 main 函数的返回值不是 int 类型,就根本通不过编译。而 gcc3.2 则会发出警告。所以,如果你想你的程序拥有很好的可移植性,请一定要用 int main 。
4. 返回值的作用
main 函数的返回值用于说明程序的退出状态。如果返回 0,则代表程序正常退出,否则代表程序异常退出。下面我们在 winxp 环境下做一个小实验。首先编译下面的程序:
int main( void )
return 0;
然后打开附件里的“命令提示符”,在命令行里运行刚才编译好的可执行文件,然后输入“echo %ERRORLEVEL%”,回车,就可以看到程序的返回值为 0 。假设刚才编译好的文件是 a.exe ,如果输入“a && dir”,则会列出当前目录下的文件夹和文件。但是如果改成“return -1”,或者别的非 0 值,重新编译后输入“a && dir”,则 dir 不会执行。因为 && 的含义是:如果 && 前面的程序正常退出,则继续执行 && 后面的程序,否则不执行。也就是说,利用程序的返回值,我们可以控制要不要执行下一个程序。这就是 int main 的好处。如果你有兴趣,也可以把 main 函数的返回值类型改成非 int 类型(如 float),重新编译后执行“a && dir”,看看会出现什么情况,想想为什么会出现那样的情况。顺便提一下,如果输入 a || dir 的话,则表示如果 a 异常退出,则执行 dir 。
5. 那么 intmain(intargc,char*argv[],char*envp[])呢?
这当然也不是标准 C 里面定义的东西!char*envp[] 是某些编译器提供的扩展功能,用于获取系统的环境变量。因为不是标准,所以并非所有编译器都支持,故而移植性差,不推荐使用。
到了这里,你应该了解为什么主函数定义为 int返回类型,而且函数体里面有return 0;这个语句了吧.
下面具体说说我对return的应用的理解。
只要一个函数的返回值是数字型的,那么就可以返回0(即return 0),其实你返回多少都没问题。一般情况下,C++做出来的函数都要求返回一个值,当函数执行正常,且达到了一般情况下的目的,那么就返回0表示正确的调用了该函数,这个0就是返回给主调函数以通知没有出错的;如果函数调用中出错,或者没有按照一般情况执行,那么就返回1,以告知主调函数采取响应策略;如果你在某个函数所在类的定义所在的头文件中定义了一组状态值(一般都是负整数),那么函数就可以返回不同的值以告之主调函数具体发生了什么异常或错误,这种情况一般用于函数功能独立性较差的的情况。所以一般不鼓励把函数返回类型定义为void,至少返回应该是int,而在函数的最后加上return 0.语句:
int func(参数列表)
……
……
……
Return 0;
在函数中,如果碰到return 语句,那么程序就会返回调用该函数的下一条语句执行,也就是说跳出函数的执行,回到原来的地方继续执行下去。但是如果是在主函数中碰到return语句,那么整个程序就会停止,退出程序的执行。
如果你定义一个函数有返回类型,可以想下面那样调用:
int func()
int value;
……
……
……
return value;
int main()
int intvalue;
intvalue=func();
……
……
teturn 0;
return语句后面具体是什么内容,这就要具体情况具体分析了:
(1) 在返回类型是char的函数中,return后应该是char类型的值;
(2) 在返回类型是int的函数中,如果是要停止函数的调用,最好应该为0;其他的按照你的目的而定,只要是int 类型就行了
(3) 在返回类型是结构类型的函数中,return后应该是结构的一个实例对象。
总之,函数定义为什么样的返回类型,该函数中return后就应该是相应类型的值
参考资料:http://zhidao.baidu.com/question/19021565.html?fr=ala0
以上是关于函数的返回类型有几种?它们的含义是啥?的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript里面this的意思是啥?有几种意思?几种用法?