在C语言中,为主函数添加一个返回语句的原因是什么?

3

如果我写的程序没有main()函数中的返回语句,那么为什么添加一个返回语句对于C语言来说很重要呢?

如果我在main()函数中省略了返回语句,我的程序会有什么劣势吗?


2
你可能想看看这个:https://dev59.com/7HVC5IYBdhLWcg3wtzkQ - Yohanes Khosiawan 许先汉
这只在SO上很重要;-)(除非您希望程序向调用者返回一个值,这在Unix上是常见的做法)。 - Peter - Reinstate Monica
@const 不是很对,那个问题是关于C++的,而这个问题是关于C的。我不是在问returnexit()的区别,我只是想知道为什么需要在main()函数中指定return - user3649506
3个回答

2

按照惯例,您需要告诉操作系统您的程序是否成功退出(通过return 0),或者是否出现错误(例如通过return错误代码)。

为了更加符合标准,请使用return EXIT_SUCCESSreturn EXIT_FAILURE


假设我想让计算机知道两种类型的错误,那么是否可以使用return 1;来指定一种错误,使用return 2;来指定另一种错误呢? - user3649506
1
是的,传统上你可以这样做。然后将错误代码返回给操作系统。 - Aniket Inge
您可以自定义在发生特定类型的错误时要执行的操作,并在纠正错误后重新运行程序。 - Aniket Inge

1
如果您希望您的代码是“合法的”(即在支持标准的所有编译器上工作),那么如果您将main定义为:
int main() {
   return 0;
}

这个函数应该返回一个整数。在这种情况下,是0。为什么?因为根据标准,如果你定义了一个函数返回类型,它应该返回那种类型。否则,它就不合法。

虽然它可能编译通过(多数编译器有宽容度,但不应依赖这一点),但这并不意味着它是正确的。


在C99中,它必须能够编译任何符合标准的编译器。 - Bryan Chen
我点赞你的回答是因为最后一段。 - user3649506
@exilonblack,不幸的是,在C99中它是错误的。 - Bryan Chen
@Bryan Chen,您是指“它可能会编译(感谢宽容的编译器,因此不应依赖此功能),但这并不意味着它是正确的”段落吗? - user3649506
1
是的。它能编译通过并不是因为编译器对你友好,而是因为程序是有效的并且应该编译通过。你可以依赖这种行为(虽然我不建议这样做)。 - Bryan Chen
1
我知道计算机并不友善,它们没有情感。在阅读了所有的评论和回复后,我决定添加return语句以使程序在未来更少出现问题。 - user3649506

0
ISO C++标准(ISO/IEC 14882:1998)明确要求main函数返回int类型。它对符合规范的程序有一个明确的“应当”约束。它应当具有int类型的返回值,但其类型在实现中是定义的。所有实现都应该允许以下两种main函数的定义:
int main() { /* … */ }
int main(int argc, char* argv[]) { /* … */ }

但 ISO C 标准 (ISO/IEC 9899:1999) 实际上并未像 C++ 标准那样强制规定此项。这让许多人感到惊讶。然而,尽管包括 Usenet comp.lang.c FAQ 文件在内的许多文档都声称可以详细阐述此事,C 标准的实际文本允许 main 函数返回其他类型。
你可以使用 int 或 void,但最好使用返回 int 的方式,因为你应该通知操作系统程序如何退出。请看一个实际的例子:
int main() {
  int a;
  printf("Enter a positive number: "); scanf("%d", &a);
  if(a<0) return 1;
  return 0;
}

我不确定这是否是最好的例子,但它可能会帮助您更好地理解概念。希望能有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接