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()等函数得到子进程退出的状态,以便作不同处理

返回值不能超过255

一般而言,在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没有被设置。