在C ++程序的主要功能中,“返回0”是什么意思?

时间:2012-01-02 01:14:10

标签: c++

  

可能重复:
  What is the proper declaration of main?

如果没有特别引用任何代码,我正在寻找以下示例的解释:

#include <iostream>

int main()
{
    std::cout << "Hello world" << std::endl;
    return 0;
}

我不明白return 0的作用。你能用尽可能简单的英语解释一下吗?

12 个答案:

答案 0 :(得分:40)

这定义了流程的exit status。尽管是int,但在类Unix系统上,该值始终在0-255范围内(参见Exit and Exit Status)。在Microsoft系统上,您可以使用32-bit signed integers as exit codes,您可以使用%ERRORLEVEL%进行检查。为了便于携带,我建议坚持0-255范围。

这是一个简单的例子:

$ cat -n exit_code.cpp 
     1  int main()
     2  {
     3      return 42;
     4  }
     5  

构建:

$ make exit_code
g++ exit_code.cpp -o exit_code

运行(在bash中):

$ ./exit_code

检查退出状态:

$ echo $?
42

常规,状态为零表示成功和非零故障。这在shell脚本中很有用,等等以指示失败的级别,如果有的话:

$ ./exit_code
exit_status=$?
if [[ ${exit_status} ]] ; then
    echo "The process failed with status ${exit_status}."
else
    echo "Success!"
fi
The process failed with status 42.

遵循以下评论......

在标准 C ++ header <cstdlib>中,定义了以下宏:

#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1

然而,Exit StatusGNU C Library documentation部分描述了相同的宏,圣洁地说:

  

便携性说明:某些非POSIX系统对退出状态值使用不同的约定。为了获得更好的可移植性,可以分别使用宏EXIT_SUCCESS和EXIT_FAILURE作为成功和失败的常规状态值。它们在文件stdlib.h中声明。

答案 1 :(得分:8)

一般return

每个函数都有返回类型

在下面的示例中,类型为void,这是一个没有值的“不完整类型”;使用this作为返回类型意味着该函数不返回任何值:

void foo() {
   std::cout << "Hello world\n";
}

但是,在下面的示例中,返回类型为int

int foo() {
   return 3;
}

return语句确定函数foo将调用的值。因此,std::cout << foo()会导致“3”被打印到标准输出。


来自return

main,具体为

当有问题的函数恰好是“主”函数或程序的入口点时,它有点特别,因为“main”函数的“返回值”被认为是程序的“退出代码” - 它告诉调用环境(例如终端会话)程序的执行是否被认为是成功的。它必须是int,值0这里的意思是“一切都很顺利”:

值得注意的是,您实际上可以在“主要”功能中完全省略return 0; ,因为它将被隐式包含在内。但是,如果您想要return 1;或其他一些值,这对您没有多大帮助,并且它不会与其他功能发挥作用。


引文

  

[C++11: 3.6.1/5]: main中的返回语句具有效果   离开主要功能(用自动销毁任何对象)   存储持续时间)并使用返回值作为调用std::exit   参数。如果控件到达main的末尾而没有遇到   return语句,效果是执行return 0;

  

[C++11: 18.5/8]:

       [[noreturn]] void exit(int status)
     

此国际标准中的函数exit()还有其他行为

     
      
  • 首先,销毁具有线程存储持续时间并与当前线程关联的对象   接下来,销毁具有静态存储持续时间的对象,并调用通过调用atexit注册的函数。有关破坏和调用的顺序,请参见3.6.3。 (由于调用exit(),自动对象不会被销毁。)
      如果控制离开了一个由exit调用的注册函数,因为该函数没有为抛出的异常提供处理程序,则应调用terminate()(15.5.1)。
  •   
  • 接下来,刷新所有打开的C流(由<cstdio>中声明的函数签名调解)和未写入的缓冲数据,关闭所有打开的C流,并通过调用tmpfile()创建的所有文件都是除去。
  •   
  • 最后,控制权返回给主机环境。如果status为零或EXIT_SUCCESS,则返回状态成功终止的实现定义形式。如果状态为EXIT_FAILURE,则返回状态为不成功终止的实现定义形式。否则返回的状态是实现定义的。
  •   

Bootnote

我建议使用these resources之一,因为在任何体面的同行评审的C ++书中都能正确解释这种事情; YouTube教程不是学习C ++的好方法,Stack Overflow贡献者通常会希望您在求助之前有一本体面的书来形成您之前的研究。

答案 2 :(得分:1)

使用它是因为您可以将程序用作命令行工具。如果有另一个进程在等待程序的输出,你可以选择在一切成功时返回0,如果有错误或任何其他常数则返回-1,根据你想要通信的内容。

答案 3 :(得分:1)

想想你的老板告诉你去接邮件。拿起邮件后,你告诉你的老板一切顺利。

操作系统是老板,程序就是你。所有return 0都告诉操作系统一切正常。

答案 4 :(得分:1)

在Windows下,您可以按如下方式测试返回值(在批处理脚本中):

MyAppTest.exe
@if "%ERRORLEVEL%" == "0" goto success
 echo Failure
 goto end
:success
 echo Success
:end

答案 5 :(得分:1)

main()返回与调用std::exit()的效果相同,并将返回值作为status参数传递。

std::exit的行为详见第18.5节([support.start.term]),并描述了状态代码:

  

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

答案 6 :(得分:0)

return用于转义函数。返回值0只允许它以代码退出:0。另外,返回0表示应用程序成功退出。

答案 7 :(得分:0)

0是一个整数。

你的主函数必须返回一个整数。

请看:

int main()
在这种情况下,

int代表整数和return,返回0:一个终止程序的整数。

通常,对于错误,您必须返回1; 0是成功的传统价值。

答案 8 :(得分:0)

取决于操作系统,但退出代码为0表示在UNIX,VMS和Windows上成功

答案 9 :(得分:0)

main函数的返回值返回给调用的应用程序或进程(很多时候这是一个shell脚本)。返回值用于表示应用程序的退出状态。

返回值应该没有强化规则,但按照惯例,返回值为零表示正常的应用程序退出。任何非零值都表示应用程序退出异常。

答案 10 :(得分:0)

在像你这样的简单应用程序中,返回的值毫无意义。如果存在观察过程(如果一个程序启动另一个程序),则可以通过简单的方式来传达状态或错误代码。

对于没有状态或错误代码的简单应用程序,大多数人return 0表示正常的应用程序退出(通常是成功),return 1表示应用程序。无法正确执行。

答案 11 :(得分:0)

在现代操作系统上,每个程序都将以特定的“退出代码”退出。

免责声明1:该概念的实际规范(根本没有退出代码)完全超出任何编程语言规范的范围。所以:任何人再次向我询问有关标准的提法可能请退回到自身,并考虑目前更好的答案。

DISPLAIMER NO 2:这些退出代码的实际值未在实际的“编程语言规范”中指定,因为这超出了“编程语言规范”的范围。

实践证明,退出代码“0”意味着“成功”,而任何其他代码都表示错误......