int main()的返回值是什么意思,以及如何显示它?

时间:2012-11-03 04:27:43

标签: c++ c return

  

可能重复:
  What should main() return in C/C++?

我在C中有这个简单的程序:

#include <stdio.h>

int main()
{
  return 8;
}

返回值的含义是什么,如何显示或如何使用它?

8 个答案:

答案 0 :(得分:4)

  

返回值的含义是什么?

用于将main()函数的状态返回给main()的调用者:

<强>参考:
C ++ 03标准:18.3开始和终止

  

最后,控制权返回给主机环境。 如果状态为零或EXIT_SUCCESS,则为   返回状态成功终止的实现定义形式。 如果状态如此   EXIT_FAILURE,返回状态失败终止的实现定义形式。   否则返回的状态是实现定义的。

     

如何显示或如何使用它?

就像显示或使用任何其他功能的返回值一样。 main()只是C / C ++中的另一个函数,在这方面没有什么特别关于main。

答案 1 :(得分:3)

在类似unix的系统上,结果代码可以显示如下:

$ ./myprogram
$ echo $?
8
$

答案 2 :(得分:2)

0EXIT_SUCCESS为某些实现定义了“成功退出”值。在某些系统上,这不一定是直接传递的。例如,在VMS上,偶数值信号失败,奇数值表示成功,因此程序中的return 0;实际上返回了一个非零值(1,如果我没记错的话)到shell。

EXIT_FAILURE给出了一些实现定义为“失败的退出”值。

C和C ++标准不会尝试定义任何其他内容,但在典型系统(Windows,Linux等)上,至少该值的底部8位将作为返回值传递回环境来自你的计划。

您可以从其他程序(尤其是shell)使用它来确定这是成功还是失败(如果是,可能是如何/为什么失败)。您可以通过生成此程序,收集返回的值,然后像任何其他数字一样打印出来来显示它:

#include <stdlib.h>
#include <stdio.h>
#include <process.h>
#include <signal.h>

int main(int argc, char **argv) {
    int retval;

    signal(SIGINT, SIG_IGN);
    retval = spawnvp(P_WAIT, argv[1], argv+1);

    printf("%s returned: %d\n", argv[1], retval);
    return 0;
}

答案 3 :(得分:1)

返回0表示正常退出。使用x返回x!= 0表示以“错误”终止。

答案 4 :(得分:0)

返回值是运行结束时的按摩,0表示没有错误,任何其他值都是错误代码。

答案 5 :(得分:0)

返回值只是告诉CPU程序退出成功或失败。 0表示退出成功,而1表示退出不成功。

EXIT_SUCCESS也等于0,EXIT_FAILURE也等于1.您可以使用signal()函数和spawnvp()函数返回它。

答案 6 :(得分:0)

C和C ++标准仅为main返回值定义了两种可能的含义,即进程成功和进程失败

遵循标准,您可以通过返回EXIT_FAILURE来调用失败含义,并且您可以通过返回0或返回{{1来调用成功含义其中两个命名常量是由EXIT_SUCCESS定义的宏符号,当它发生时,它也声明<stdlib.h>exit

在* nix和Windows的实践中,返回的值直接变为进程退出代码。其主要用途是在此成功或失败的情况下有条件地执行其他程序。例如,在Windows [cmd.exe]中:

[D:\dev\test]
> md blah

[D:\dev\test]
> (rd blah 2>nul) && echo pesky dir removed || echo oops, unable to remove dir
pesky dir removed

[D:\dev\test]
> echo %errorlevel%
0

[D:\dev\test]
> (rd blah 2>nul) && echo pesky dir removed || echo oops, unable to remove dir
oops, unable to remove dir

[D:\dev\test]
> echo %errorlevel%
2

[D:\dev\test]
> _

在* nix和Windows中,您可以返回除C和C ++标准定义的值之外的其他值。

然而,在Windows中,一个略高于256的值(我永远无法回想起确切的值)被用作轮询进程是否已完成的状态代码,因此要避免出现问题,应该保持低于256,或者远高于它,例如32位状态码。

答案 7 :(得分:0)

返回的值将发送到父进程,该进程分叉一个新进程并执行您的程序。通常父类是shell,因此它不对它做任何事情,但如果父进程不是shell,那么父进程可以使用它来知道子进程的退出状态,并且可以根据它采取适当的操作。