exit()函數介紹
函數名: exit()
所在頭文件:stdlib.h(如果是c++,頭文件:#include < cstdlib >)
功 能: 關閉所有文件,終止正在執行的進程。
exit(0)表示正常退出,
exit(x)(x不爲0)都表示異常退出,這個x是返回給操作系統(包括UNIX,Linux,和MS DOS)的,以供其他程序使用。
stdlib.h: void exit(int status);//參 數status,程序退出的返回值
exit()和return的區別
如果main()在一個遞歸程序中,exit()仍然會終止程序;
但return將控制權移交給遞歸的前一級,直到最初的那一級,此時return纔會終止程序。
即使在除main()之外的函數中調用exit(),它也將終止程序。
return();是某個函數的結束,並返回結果。
-
return返回函數值,是關鍵字; exit 是一個函數。
-
return是語言級別的,它表示了調用堆棧的返回;而exit是系統調用級別的,它表示了一個進程的結束。
-
return是函數的退出(返回);exit是進程的退出。
-
return是C語言提供的,exit是操作系統提供的(或者函數庫中給出的)。
-
return用於結束一個函數的執行,將函數的執行信息傳出個其他調用函數使用;exit函數是退出應用程序,刪除進程使用的內存空間,並將應用程序的一個狀態返回給OS,這個狀態標識了應用程序的一些運行信息,這個信息和機器和操作系統有關,一般是 0 爲正常退出,非0 爲非正常退出。
-
非主函數中調用return和exit效果很明顯,但是在main函數中調用return和exit的現象就很模糊,多數情況下現象都是一致的。
測試1
#include<stdlib.h>
#include<stdio.h>
#include <string.h>
int main(int argc,char*argv[])
{
int status;
printf("Enter either 1 or 2\n");
status=getchar();
exit(status-'0');
printf("this line is never reached\n");
return 0;
}
調用exit()函數退出時,printf(“this line is never reached\n”);和return 0;和兩句都不會執行。
測試2
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
int output( )
{
int a[10];
ofstream outfile("f1.dat",ios::out);//定義文件流對象,打開磁盤文件"f1.dat"
if(!outfile) //如果打開失敗,outfile返回值
{
cerr<<"open error!"<<endl;
exit(1);
}
cout<<"enter 10 integer numbers:"<<endl;
for(int i=0;i<10;i++)
{
cin>>a[i];
outfile<<a[i]<<" ";
} //向磁盤文件"f1.dat"輸出數據
outfile.close(); //關閉磁盤文件"f1.dat"
return 0;
}
int main(){
output();
cout<<"end!"<<endl;
return 0;
}
未進入exit(1) 分支,正常執行end!
把if(!outfile)修改爲if(outfile),讓程序估計進入exit(1)分支
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
int output( )
{
int a[10];
ofstream outfile("f1.dat",ios::out);//定義文件流對象,打開磁盤文件"f1.dat"
if(outfile) //如果打開失敗,outfile返回值
{
cerr<<"open error!"<<endl;
exit(1);
}
cout<<"enter 10 integer numbers:"<<endl;
for(int i=0;i<10;i++)
{
cin>>a[i];
outfile<<a[i]<<" ";
} //向磁盤文件"f1.dat"輸出數據
outfile.close(); //關閉磁盤文件"f1.dat"
return 0;
}
int main(){
output();
cout<<"end!"<<endl;
return 0;
}
執行exit(1)函數後,整個程序直接結束,exit(1)後面的代碼都不會執行,output()子函數也不會執行返回,main函數後面的語句cout<<“end!”<<endl;也不會執行。和return不一樣。