exit () and return ()
来源:互联网 发布:淘宝联盟插件 编辑:程序博客网 时间:2024/06/05 15:19
exit(int n)其实就是直接退出程序,因为默认的标准程序入口为
int main(int argc, char** argv),返回值是int型的。
一般在shell下面,运行一个程序,然后使用命令echo $?就能得到该程序的返回值,也就是退出值,在main()里面,你可以用return n,也能够直接用exit(n)来做。unix默认的习惯正确退出是返回0,错误返回非0
exit()函数的参数有什么区别?
理论上可以返回任何整数。返回的不同数值主要是给调用者作不同处理的。
单独的进程是返回给操作系统的。如果是多进程,是返回给父进程的。
在父进程里面调用waitpid()等函数得到子进程退出的状态,以便作不同处理
一般而言,在UNIX/LINUX下,程序都是有返回值的。
即使是SHELL命令也有,一个执行成功的SHELL命令和一个执行失败的SHELL命令返回值肯定是不同的,可以试一试的,终端状态下,SHELL命令行下,打 echo $? 就会返回上一次命令的返回值,如果上一条命令执行成功,一般返回值是 0 ,如果不成功,返回非 0 是值。
在main函数中我们通常使用return (0);这样的方式返回一个值。
但这是限定在非void情况下的也就是void main()这样的形式。
exit()通常是用在子程序中用来终结程序用的,使用后程序自动结束跳会操作系统。
但在如果把exit用在main内的时候无论main是否定义成void返回的值都是有效的,并且exit不需要考虑类型,exit(1)等价于return (1)
#include <iostream>
#include <string>
using namespace std;
int main()
{
exit (1);//等价于return (1);
}
return只能返回一个值,但是可以是一个结构.如数组.
返回一个结构体,这样的做法不提倡,可以返回一个指针但要注意所指变量的生命期,常见的就是由参数指针返回或者引用返回。
比如
int div(int a,int b,int *r)
{
*r=a%b;
return a/b;
}
函数返回的是a/b的商,而指针返回的是a%b的余数
main()
{
int a=13,b=3,c,r;
c=div(a,b,&r);/*这样div函数就返回了两个值c和r*/
}
C++中可以用引用,更方便:
void swap(int &a,int &b)
{
int t=a;
a=b;
b=t;
}
main()
{
int a=1,b=2;
swap(a,b);/*a,b的值改变了*/
}
但是原理很简单
要从一个子函数返回多个值有三个最方便的方法:
1。利用指向数组的指针
2。利用引用
3。返回一个自定义的结构
1、return只能返回一个值就是没有疑问的,
不管是返回指针还是返回结构体,都是返回的一个值。
返回指针要特别当心,因为如果返回的是局部变量的指针的话,
离开这个函数,变量就被撤消了,再使用你返回的指针就没有意义了。
2、利用引用的参数或者是向函数传递变量指针也是很好的方法。
还有一种就是使用全局变量向函数外传递信息。
exit()子程序终止函数与return()函数的差别
在main函数中我们通常使用return (0);这样的方式返回一个值。
但这是限定在非void情况下的也就是void main()这样的形式。
exit()通常是用在子程序中用来终结程序用的,使用后程序自动结束跳会操作系统。
但在如果把exit用在main内的时候无论main是否定义成void返回的值都是有效的,并且exit不需要考虑类型,exit(1)等价于return (1)
#include <iostream>
#include <string>
using namespace std;
int main()
{
exit (1);//等价于return (1);
}
如果以abort函数(此函数不带参数,原型为void abort(void))终止程序,则会在debug模式运行时弹出所示的对话框。
Debug Error!
Program: D:/vcproject/exception/exception/Debug/exception.exe
abnormal program termination
(Press Retry to debug the application)
终止 重试 忽略
断言(assert)
assert宏在C语言程序的调试中发挥着重要的作用,它用于检测不会发生的情况,表明一旦发生了这样的情况,程序就实际上执行错误了,例如strcpy函数:
char *strcpy(char *strDest, const char *strSrc)
{
char * address = strDest;
assert((strDest != NULL) && (strSrc != NULL));
while ((*strDest++ = *strSrc++) != '/0')
;
return address;
}
其中包含断言assert( (strDest != NULL) && (strSrc != NULL) ),它的意思是源和目的字符串的地址都不能为空,一旦为空,程序实际上就执行错误了,会引发一个abort。
assert宏的定义为:
#ifdef NDEBUG
#define assert(exp) ((void)0)
#else
#ifdef __cplusplus
extern "C"
{
#endif
_CRTIMP void __cdecl _assert(void *, void *, unsigned);
#ifdef __cplusplus
}
#endif
#define assert(exp) (void)( (exp) || (_assert(#exp, __FILE__, __LINE__), 0) )
#endif /* NDEBUG */
如果程序不在debug模式下,assert宏实际上什么都不做;而在debug模式下,实际上是对_assert() 函数的调用,此函数将输出发生错误的文件名、代码行、条件表达式。例如下列程序:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
char * myStrcpy( char *strDest, const char *strSrc )
{
char *address = strDest;
assert( (strDest != NULL) && (strSrc != NULL) );
while( (*strDest++ = *strSrc++) != '/0' );
return address;
}
int main(void)
{
myStrcpy(NULL,NULL);
return 0;
}
在此程序中,为了避免我们的strcpy与C库中的strcpy重名,将其改为myStrcpy。程序的输出
Assertion failed:(strDest != NULL) && (strSrc != NULL). file
D:/vcproject/exception/exception/main.c line?
abnormal program termination
失败的断言也会弹出如上所示的对话框,这是因为_assert()函数中也调用了abort()函数。
一定要记住的是assert本质上是一个宏,而不是一个函数,因而不能把带有副作用的表达式放入assert的"参数"中。
errno
errno在C程序中是一个全局变量,这个变量由C运行时库函数设置,用户程序需要在程序发生异常时检测之。C运行库中主要在math.h和stdio.h头文件声明的函数中使用了errno,前者用于检测数学运算的合法性,后者用于检测I/O操作中(主要是文件)的错误,例如:
#include <errno.h>
#include <math.h>
#include <stdio.h>
int main(void)
{
errno = 0;
if (NULL == fopen("d://1.txt", "rb"))
{
printf("%d", errno);
}
else
{
printf("%d", errno);
}
return 0;
}
在此程序中,如果文件打开失败(fopen返回NULL),证明发生了异常。我们读取error可以获知错误的原因,如果D盘根目录下不存在"1.txt"文件,将输出2,表示文件不存在;在文件存在并正确打开的情况下,将执行到else语句,输出0,证明errno没有被设置。
- exit () and return ()
- Difference between exit and return
- return、exit
- return() exit()
- exit(0) exit(1) return
- return 与 exit
- return 和exit
- exit abort return 区别
- exit和return区别
- return,exit,_exit区别
- exit和return
- exit和return
- return与exit()
- exit()和return
- exit abort return 区别
- 关于exit() 和 return ()
- exit和return区别
- return,exit() 与errno;
- 用API写的VB6 的串口类,出现“遇到问题需要关闭”
- 从网站上获取需要的数据实力(天气预报)
- 平淡生活:技术部年会
- 用SQL存储过程实现批量插入数据
- oracle 存储过程的基本语法
- exit () and return ()
- Oracle函数列表速查
- 最近CSDN上看到了一则被网友称为“最牛B”的一则招聘启事
- 2008,太阳能产业进入黄金期
- Chinapub 100万会员评选出来的2007年IT图书排行榜
- 虚拟网卡 TUN/TAP 驱动程序设计原理
- Oracle分页程序思路
- 学会思考,学会使用帮助工具
- http://www.seasar.org/cn/index.html