从主要必须返回零,并且main的返回值如何有用?

时间:2010-09-25 11:03:13

标签: c return-value exit-code

我知道C89中的约定总是在C程序中从main返回0整数值,如下所示:

int main() {

    /* do something useful here */

    return 0;
}

这是为了向操作系统返回“成功”结果。我仍然认为自己是C语言中的新手(或者说是最好的中级程序员),但到目前为止,我还没有完全理解为什么这很重要。

我的猜测是,如果你将这个程序的输出绑定到另一个程序的输入中,这是一个有用的返回结果,但我不确定。我从来没有发现它有用,或者我只是不明白其意图是什么。

我的问题:

  1. 从C程序返回零是否总是必要的?
  2. main()的返回值有用吗?

7 个答案:

答案 0 :(得分:5)

编写脚本时(如Windows中的Bash或CMD.exe) 你可以用&&和和||运算符。

通常,如果a && b的结果为零,则b将运行a,如果a || b返回非零,则b将运行a

如果您希望在前一个命令成功的情况下有条件地运行命令,这将非常有用。例如,如果文件包含单词foo,则要删除该文件。然后你将使用:

grep foo myfile && rm myfile

grep在匹配时返回0,否则为非零。

答案 1 :(得分:2)

返回0是惯例。当程序返回0时,可以假设它工作正常,而不是实际查看程序做了什么(嗯:D)。

作为一种广泛使用的惯例,这种假设存在于很多地方。正如Benoit所指出的那样是shell(UNIX和Windows)以及操作系统的其他部分。

回答你的问题:

  1. 对于C程序,您必须返回 EXIT_SUCCESS或EXIT_FAILURE。 但是你甚至可以返回EXIT_FAILURE 如果你的程序运行正常。
  2. 如果你 不返回0(EXIT_SUCCESS), 其他很可能 程序将承担您的计划 失败。
  3. 有一个与C ++和C有很好回应的相关问题

    What should main() return in C and C++?

答案 2 :(得分:1)

返回值是程序执行的“结果”,0表示成功终止,而非零返回值表示失败或意外终止。

当您正常调用程序时,返回值对系统并不重要,但它有两个目的。其中一个是调试。在MSVC中,最常用的C ++编译器,您会看到程序在完成执行后返回值。这有助于查看程序退出的“方式和原因”。

另一种用途是从其他程序调用您的应用程序,其中返回值可能表示成功,或传递结果。

答案 3 :(得分:1)

在现代C又名C99中(对C89不确定)main的所有三个终点都是等价的:

  • 刚刚在main
  • 结束}
  • return 0
  • exit(0)

所有这一切背后的想法是(正如其他人提到的那样)给予调用程序返回状态。

答案 4 :(得分:0)

Hiya,就像你说的那样,主要是因为程序被用作更广泛的程序网络的一部分。将零返回到程序环境让网络知道一切都很顺利(就像你说的那样)但是你也可以让它返回1,2,3 ......(取决于发生了什么错误)让你的代码网络知道某些东西出了问题。同样地,您可以在“main”程序的末尾使用exit(0)或exit(1)来执行完全相同的操作。您可能会发现这很有用: http://en.wikipedia.org/wiki/Exit_status 希望有所帮助。千斤顶

答案 5 :(得分:0)

程序正确完成时应使用EXIT_SUCCESS,而不执行EXIT_FAILURE。例如,EXIT_SUCCESS为零,零可以移植到任何操作系统,而EXIT_FAILURE从UNIX更改为Windows。这些常量在stdlib.h标题中定义。

#include <stdlib.h>

int main()
{

    int toret = EXIT_SUCCESS;

    if ( !( /* do something useful here */ ) ) {
        toret = EXIT_FAILURE;
    }

    return toret;
}

当为控制台编写程序时,程序的返回代码更有用。如今,这种情况非常罕见,除非您在非常专业的环境中工作(即使现在这种情况正在发生变化,也可以使用工作流程工具)。

正如@Benoit所说,退出代码告诉操作系统操作是否成功。如果退出代码意味着失败,那么您可以打破批处理程序的流程,因为它不太可能成功。

例如,如果编译成功,编译器可以具有零退出代码,如果编译不成功,则编译器可以具有任何其他值。在Windows中,可以通过操作系统变量“errorlevel”访问它:

gcc helloworld.cpp -ohelloworld.exe
goto answer%errorlevel%
:answer0
copy helloworld.exe c:\users\username\Desktop
echo Program installed
goto end
:answer1
echo There were errors. Check your source code.
:end
echo Now exiting...

当编译成功时,此Windows批处理文件在桌面中“安装”helloworld.exe。由于您可以通过双击触发批处理文件的执行,因此可以避免触及命令行进行编译。

当然,考虑到集成环境可以更好地管理(如果退出代码不存在,它们将无法正常工作)。另请注意, make 在此字段中最佳:

https://en.wikipedia.org/wiki/Make_(software)

使还需要退出代码才能正常运行。

答案 6 :(得分:0)

我们可以从main()返回任何整数。 现在,默认情况下main()函数返回0,如果我们没有明确提到main()函数来返回任何特定值。

返回0实际上类似于程序成功终止而没有任何错误,虽然它不是规则,但这是它的工作方式。

如果我们显式地返回一个非零数字,那么即使程序正确运行但在内部实际上意味着程序终止了一些错误或程序以意外结果终止。如果另一个程序被调用,这可能很有用我们目前的计划使用&amp;&amp;&amp;&#39;或者&#39; ||&#39;在我们的命令行中。

您还可以使用以下命令检查以前在linux上执行的程序的返回值:

echo $?