2010-09-25 25 views
5

我知道它已经在C89会议始终在C程序返回从主0的整数值,像这样:从主返回零是必要的,主返回值如何有用?

int main() { 

    /* do something useful here */ 

    return 0; 
} 

这是一个“成功”的结果返回给操作系统。我仍然认为自己是C语言的新手(或者中级程序员),但是迄今为止,我从来没有完全理解为什么这很重要。

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

我的问题:

  1. 将返回从C程序零总是有必要吗?
  2. main()的返回值如何有用?
+0

http://stackoverflow.com/questions/204476/what-should-main-return-in -c-and-c – 2015-08-06 20:24:23

回答

5

当(Bash中,或cmd.exe,在Windows等)编写脚本 您可以链接一些命令与& &和||运营商。

规范地,a && b将运行b如果a结果是零,而a || b将运行b如果a返回非零值。

如果您希望在前一次成功时有条件地运行命令,这很有用。例如,如果文件包含单词foo,您想要删除它。然后您将使用:

grep foo myfile && rm myfile 

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

+0

这对您有帮助吗? – 2010-09-25 11:13:12

+0

我认为你的回答很有用,但它不是很清楚。你可以给我一个例子吗?它看起来像剪切和粘贴了护目镜搜索中的一些文本... – dvanaria 2010-09-25 11:15:33

+0

不,我没有剪裁和过去,但我不是英语母语的人,因此有时候会让一些读者困惑。 – Benoit 2010-09-25 11:17:25

1

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

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

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

0

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

1

在现代的C又名C99(不知道为C89)所有的main三个终端是等价的:

  • 只是在最后}
  • return 0
  • exit(0)
结束 main

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

+0

第一个不正确。除了显式的'return'外,C函数将返回它所评估的最后一个东西。 'int main(){printf(“Hello,world!\ n”); }''实际上会用'14'退出,因为'printf()'返回了它。 (如果你已经打开了编译器警告,编译这个会发出警告,以便控制达到非void函数的末尾)。第二个只在'main()'中是正确的。 – Blrfl 2010-09-25 12:31:45

+5

第一个*在C99中是正确的(但在C89中不是):“如果主函数的返回类型是与int兼容的类型,则到达终止主函数的返回值0”。 (C99 5.1.2.2.3) – schot 2010-09-25 12:50:32

0

程序正确结束时应该使用EXIT_SUCCESS,否则应该使用EXIT_SUCCESS。例如,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... 

此窗口批处理文件“安装”在HelloWorld.exe的桌面。由于您可以通过双击触发批处理文件的执行,因此可以避免触摸命令行进行编译。

当然,考虑到集成环境可以更好地管理(如果退出代码不存在,它们将无法正常工作)。还要注意的是使最好是在这一领域:

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

也需要退出的代码正确运行。

+0

C的正确include文件是“stdlib.h”而不是“cstdlib.h” – 2010-09-25 14:16:59

+0

感谢您指出这个笨拙的错误。 – Baltasarq 2010-09-25 16:57:01

+0

我发现你的说法是,退出代码“非常罕见”,非常奇怪。当然有很多地方不再被广泛使用,但这些地方是C本身不再被广泛使用的地方。在大多数情况下,如果您使用C,那么您很可能也会关心退出代码。 – Porculus 2010-09-25 17:10:04

2

返回0是一个约定。当一个程序返回0时,可以认为它没有问题,但实际上并没有看到程序做了什么(ahem:D)。

作为一个广泛使用的约定,这个假设在很多地方。正如Benoit指出的那样,shell(UNIX和Windows)以及操作系统的其他部分就是如此。

所以回答你的问题:

  1. 对于C程序,您必须返回 要么EXIT_SUCCESS或EXIT_FAILURE。 但是如果你的程序工作正常,你可以返回EXIT_FAILURE,即使是 。
  2. 如果 不返回0(EXIT_SUCCESS), 它很可能其他 程序就会认为你的程序 失败。

有一个相关的问题与C++和C大的反应

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

0

我们可以从main()返回任何整数。 现在,默认main()函数返回0,如果我们没有明确提及main()函数返回任何具体的值。

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

如果我们明确地返回一个非零数字,那么即使程序运行正常,但在内部它实际上意味着程序终止时出现了一些错误或程序以意外结果终止。如果调用另一个程序,这会很有用根据我们目前的程序返回值使用'& &'或'||'在我们的命令行中。

您也可以使用此命令查看以前执行的程序在Linux上的价值回归:

echo $?