exit把控制权交给系统,而return将控制权交给调用函数。
exit()有返回值的,不过返回值传递给操作系统或者说运行环境。
exit用于在程序运行的过程中随时结束程序,exit的参数是返回给OS的。
main函数结束时也会隐式地调用exit函数。exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准I/O函数tmpfile ()创建的临时文件。
exit用于在程序运行的过程中随时结束程序,exit的参数是返回给OS的。
main函数结束时也会隐式地调用exit函数。exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准I/O函数tmpfile ()创建的临时文件。
c++ primer第四版中文版 216页最下方有一句话
“主函数main不能调用自身”
“主函数main不能调用自身”
但以下程序可以编译成功。
int main(int argc, char** argv) {
if(argc==0)
return 0;
if(argc==0)
return 0;
//exit(0);
else {
int rv;
rv=main(argc-1, argv);
printf("%s\n",argv[argc-1]);
return rv;
}
}
else {
int rv;
rv=main(argc-1, argv);
printf("%s\n",argv[argc-1]);
return rv;
}
}
分别将第三行代码换成return 0; 或 exit(0);
从这里面可以看出,使用exit程序直接退出,不能继续执行,而如果用return的话,main函数是作为一个普通的函数进行递归调用的。
由此,我认为文章开头的句红字是正确的,而以下的一些内容,是我在网上各处搜集,别人的一些解释,留作对比。
要区分c和c++,c++中的main函数不可以递归调用,但是c可以
#include <iostream>
class A
{
public:
A(){ std::cout << "A constructed\n"; }
~A(){ std::cout << "A destructed\n"; }
};
int main()
{
A a;
//return 0;
exit(0);
}
如果用exit,那么main函数中的对象a将没有析构,而用return返回,a将被正常析构
当没有exit(0)时,return 0时,系统会输出并清理缓冲区并关闭标准输入cin、标准输出cout、标准错误cerr、标准日志clog。
当有exit(0)时,c函数会输出并清理stdin, stdout,现在stdout已经被关闭了,在执行return 0时,cout的缓冲区的数据已经没有写入的目标了,所以无输出。
这只能说明cout和stdout, cin 和stdin用的是不同的缓冲区。
当有exit(0)时,c函数会输出并清理stdin, stdout,现在stdout已经被关闭了,在执行return 0时,cout的缓冲区的数据已经没有写入的目标了,所以无输出。
这只能说明cout和stdout, cin 和stdin用的是不同的缓冲区。
为什么用return 0 的时候对象b能自动调用析构函数,完全是编译器干的。
在c main函数中exit和return是相同的;而在c++中,编译器会将类析构函数的汇编代码插入到return前面,但对exit不作任何变动。
C++ 中要尽量避免使用exit。