【问题标题】:Why does main() not need a return statement? [duplicate]为什么 main() 不需要 return 语句? [复制]
【发布时间】:2012-11-05 13:06:59
【问题描述】:

可能重复:
return 0 implicit
Why is return 0 optional?

为什么即使不使用exitreturn,C 中的 main() 函数也能正确终止?

例如:

#include<stdio.h>

int sum(int a,int b)
{
 return (a + b);
}

int main()
{
 int a=10;
 int b=5;
 int ans;    
 ans=sum(a,b);
 printf("sum is %d",ans);
}

【问题讨论】:

  • @freeboy1015 正如 Ed 所指出的,如果您的问题得到了您所需要的答案,请点击最合适答案旁边的复选标记。您可以通过点击您的个人资料然后转到“问题”来查看旧问题。

标签: c


【解决方案1】:

因为 C99 和 C11 标准是这样说的:

5.1.2.2.3 程序终止

到达终止main函数的} 返回值0。如果返回类型与int不兼容, 返回到宿主环境的终止状态未指定。

但是,您应该添加退货声明。这是因为返回值在 C89 中是 undefined 否则!

3.6.6.4 返回语句

到达终止函数的} 相当于执行一个 不带表达式的 return 语句。

2.1.2.2 托管环境

如果主函数执行一个没有指定值的返回,则 返回宿主环境的终止状态未定义。

【讨论】:

  • 这似乎是唯一明智的答案。
  • 并且记录在案,C99和C11在这件事上是完全一致的。
【解决方案2】:

因为编译器为你添加了一个隐含的exit

检查 nightcracker 的原因;我仍然强烈建议您使用有意义的返回码进行显式退出/返回。

C99 标准:

如果主函数的返回类型是与int兼容的类型, 从初始调用返回到主函数相当于 使用主函数返回的值调用退出函数 作为它的参数;10) 到达终止主函数的 } 返回值 0。如果返回类型与 int 不兼容, 返回宿主环境的终止状态为 未指定。

我正在寻找要检查的 C89 文本。

【讨论】:

  • C89 和 C99 在这里是不同的,不是吗?
  • @Kirilenko 是的,在 C89 中,您必须拥有 return(我什至不确定 exit 是否符合当时的 return )。另一方面,在 C99 中,您必须声明main的返回type
【解决方案3】:

因为如果执行终止而没有任何一个它假定它是成功的,即返回 0。

【讨论】:

    【解决方案4】:

    主要,如果你不使用标志,你的编译器不会告诉你任何事情。

    如果你使用了严格的标志,你的编译器会告诉你每一个缺失的细节。

    返回一些东西很重要,启动你的程序可以被告知你的程序执行成功与否。如果您的程序不返回任何内容(默认为 0),例如,您启动它的终端将假定它即使失败也能正常运行。

    【讨论】:

      【解决方案5】:

      因为编译器会为你添加它。

      在 unix/linux 上你可以试试这个小脚本:

      retval.sh

      #!/bin/sh
      $1
      echo $?
      

      然后通过它运行你的程序:

      ./retval.sh yourprogram
      

      它会输出你程序的返回值。即使您不添加任何返回,您也会看到 main() 或 exit() 将返回一个整数值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-21
        • 2021-01-28
        相关资源
        最近更新 更多