关于C#:退出和退货有什么区别?


What is the difference between exit and return?

本问题已经有最佳答案,请猛点这里访问。

当从C程序的任何地方调用时,C程序中的RETURN和EXIT语句有什么区别?


  • 返回是从函数调用返回的语言指令。
  • exit是终止当前进程的系统调用(不是语言语句)。

当两者都做(几乎)相同的事情时,唯一的情况是在main()函数中,因为从main返回执行exit()。好的。

return示例:好的。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

void f(){
    printf("Executing f
"
);
    return;
}

int main(){
    f();
    printf("Back from f
"
);
}

如果执行此程序,它将打印:好的。

1
2
Executing f
Back from f

exit()的另一个例子:好的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <stdlib.h>

void f(){
    printf("Executing f
"
);
    exit(0);
}

int main(){
    f();
    printf("Back from f
"
);
}

如果执行此程序,它将打印:好的。

1
Executing f

你永远不会"从F回来"。还要注意调用库函数exit()所必需的#include 。好的。

另外请注意,exit()的参数是一个整数(它是启动程序进程可以获得的进程返回状态;常规用法是0表示成功或任何其他错误值)。好的。

返回语句的参数是函数的返回类型。如果函数返回void,则可以省略函数末尾的返回。好的。

最后一点,exit()有两种口味:_exit()exit()。两种形式的区别在于,exit()和return from main在真正终止进程之前调用使用atexit()on_exit()注册的函数,而_exit()(来自#include 或其同义词exit from #include 立即终止进程。好的。

现在也有一些特定于C++的问题。好的。

当C++退出函数时,C++比C执行更多的工作(EDOCX1,2,-ing)。具体来说,它调用超出范围的本地对象的析构函数。在大多数情况下,程序员在进程停止后不会太在意程序的状态,因此不会有太大的区别:分配的内存将被释放,文件资源将关闭等等。但如果析构函数执行ios,这可能会很重要。例如,自动创建的C++ EDCOX1(17)在调用退出时不会被刷新,可能会丢失一些未刷新的数据(另一方面,静态EDCOX1(17)将被刷新)。好的。

如果您使用的是好的C FILE*流,则不会发生这种情况。这些将在exit()上冲洗。实际上,规则与注册的exit函数相同,FILE*将在所有正常终端上刷新,包括exit(),但不调用_exit()或abort()。好的。

你还应该记住C++提供了一种摆脱函数的第三种方法:抛出异常。这种走出函数的方法将调用析构函数。如果在调用方链的任何位置都没有捕获到异常,则异常可以转到main()函数并终止进程。好的。

如果你从EDCOX1,1,或EDCOX1,2,或者在你的程序中的任何地方调用EDCOX1,0调用,就会调用静态C++对象的析构函数。如果程序使用_exit()abort()终止,则不会调用它们。abort()在调试模式下最有用,目的是立即停止程序并获取堆栈跟踪(用于事后分析)。它通常隐藏在assert()宏后面,仅在调试模式下处于活动状态。好的。

exit()什么时候有用?好的。

exit()表示要立即停止当前进程。当我们遇到某种不可恢复的问题时,它可能对错误管理有一定的帮助,而这些问题将不再允许您的代码做任何有用的事情。当控制流很复杂并且错误代码必须一直向上传播时,这通常很方便。但请注意,这是一种糟糕的编码实践。在大多数情况下,静默结束进程更坏的行为和实际的错误管理应该是首选的(或者在C++中使用异常)。好的。

直接调用exit()如果在库中执行,则会特别糟糕,因为它将使库用户陷入困境,因此库用户应该选择是否执行某种错误恢复。如果你想要一个例子来说明为什么从图书馆调用exit()是不好的,它会导致人们问这个问题。好的。

有一个无可争议的合法使用exit()作为终止由fork()在支持它的操作系统上启动的子进程的方法。回到fork()之前的代码通常是一个坏主意。这是解释exec()系列函数为何永远不会返回调用方的基本原理。好的。好啊。


我写了两个程序:

1
int main(){return 0;}

1
2
#include <stdlib.h>
int main(){exit(0)}

执行gcc -S -O1后。这是我看到的装配时(仅重要零件):

1
2
3
main:
    movl    $0, %eax    /* setting return value */
    ret                 /* return from main */

1
2
3
4
5
main:
    subq    $8, %rsp    /* reserving some space */
    movl    $0, %edi    /* setting return value */
    call    exit        /* calling exit function */
                        /* magic and machine specific wizardry after this call */

所以我的结论是:可以的时候用return,需要的时候用exit()


在C语言中,在程序的启动函数(可以是main()wmain()_tmain()或编译器使用的默认名称)中使用时没有太大的差别。

如果您在main()中使用return,控制权将返回到c库中的_start()函数,该库最初启动您的程序,然后无论如何调用exit()。所以你用哪一个并不重要。


RETURN语句退出当前函数,EXIT()退出程序

1
they are the same when used in main() function

另外,RETURN是一个语句,而exit()是一个需要stdlb.h头文件的函数