6

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

int main() {

    /* do something useful here */

    return 0;
}

这是为了向操作系统返回一个“成功”的结果。我仍然认为自己是 C 的新手(或充其量是中级程序员),但迄今为止我从未完全理解为什么这很重要。

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

我的问题:

  1. 是否总是需要从 C 程序返回零?
  2. main()从有用的返回值如何?
4

7 回答 7

7

编写脚本时(例如在 Bash 中,或 Windows 上的 CMD.exe),您可以使用 && 和 || 链接一些命令 运营商。

典型地,如果结果为零则运行a && b,如果返回非零则运行。baa || bba

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

grep foo myfile && rm myfile

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

于 2010-09-25T11:08:53.220 回答
2

返回 0 是一个约定。当程序返回 0 时,可以假定它运行良好,而无需实际查看程序做了什么(咳咳:D)。

作为一种广泛使用的约定,这种假设存在于很多地方。正如 Benoit 所指出的,shell(UNIX 和 Windows)和操作系统的其他部分就是这种情况。

所以回答你的问题:

  1. 对于 C 程序,您必须返回 EXIT_SUCCESS 或 EXIT_FAILURE。但是即使您的程序运行良好,您也可以返回 EXIT_FAILURE。
  2. 如果您不返回 0 (EXIT_SUCCESS),则其他程序很可能会认为您的程序失败。

有一个与 C++ 和 C 相关的问题很好的回应

main() 在 C 和 C++ 中应该返回什么?

于 2010-09-25T12:39:27.513 回答
2

在现代 C aka C99(不确定 C89)中,所有三个终止符main都是等效的:

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

这一切背后的想法是(正如其他人提到的)为调用程序提供返回状态。

于 2010-09-25T11:30:58.573 回答
1

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

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

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

于 2010-09-25T11:18:25.940 回答
0

嗨,就像您说的那样,主要是将该程序用作更广泛的程序网络的一部分。将零返回到程序环境让网络知道一切正常(就像你说的那样)但是你也可以让它返回 1、2、3...(取决于发生了什么错误)让你的代码网络知道某事出错了。等效地,您可以在“主”程序的末尾使用 exit(0) 或 exit(1) 来执行完全相同的操作。您可能会发现这很有用: http ://en.wikipedia.org/wiki/Exit_status 希望对您有所帮助。杰克

于 2010-09-25T11:20:25.527 回答
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_(软件)

还需要退出代码才能正确运行

于 2010-09-25T12:08:36.373 回答
0

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

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

如果我们显式返回一个非零数字,那么即使程序运行正确但在内部它实际上意味着程序因某些错误而终止或程序因意外结果而终止。如果根据我们当前调用另一个程序,这可能很有用程序使用 '&&' 或 '||' 返回值 在我们的命令行中。

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

echo $?
于 2017-01-06T14:57:39.790 回答