【问题标题】:why do we need a return statement in main while using C [closed]为什么我们在使用 C 时需要在 main 中使用 return 语句 [关闭]
【发布时间】:2019-11-09 13:22:29
【问题描述】:

为什么我们在 C 的 main 中需要一个返回函数? 因为当我尝试在 main 中的 return 语句之后编写语句时,main 之后的语句没有被执行,但它应该在控制从调用函数返回到 main 之后执行,它应该在 return 语句之后执行语句直到 a遇到右括号?

示例:

int main()
 {
   printf("Hello World");
   return 0;
   printf("hi"); // This does not gets executed
 }

【问题讨论】:

  • 什么?如果您 return 从 main 则没有要返回的调用函数(至少在您的代码中没有)。
  • @PRIYANKA CHETTRI 显示程序示例。否则不清楚你的意思。
  • @PRIYANKA CHETTRI 由于return语句,控制从main传出时,main中的语句将如何执行?
  • 标题中的问题与正文中的问题不一样。这里有两个不同的问题 - 在 SO 上你应该避免这个问题 - 你可能无法在一个答案中同时得到这两个问题的答案。

标签: c


【解决方案1】:

为什么我们在 C 的 main 中需要一个返回函数?

main() 的返回值被返回到“系统”并被解释为一个进程退出代码,例如可以在 shell 脚本和批处理文件中使用。以 Windows 为例:

> myprogram
Hello World
> echo myprogram returned %errorlevel%
myprogram returned 0

[...] 是否应该执行 return 语句之后的语句,直到遇到右括号?

没有。当遇到return(名称中包含线索!)或右大括号时(以先发生者为准),函数将返回。 return 语句可以出现在函数中的任何位置,并且一个函数可能有多个 return 语句。如果在 return 之前遇到右大括号,那么这是一个 隐式返回,如果调用者尝试使用返回值,则对于非 void 函数是未定义的行为。

当您从main() 返回时,控制权将返回给系统,并在终止进程且操作系统恢复资源、关闭文件等的托管环境中。

【讨论】:

    【解决方案2】:

    return 是关键字而不是函数。它从当前执行的函数返回给调用者。

    main函数从启动代码中调用,通常返回值包含程序的退出状态。

    【讨论】:

      【解决方案3】:

      'return' 语句不是函数调用。实际上恰恰相反。它不是调用另一个函数,而是将一个新函数添加到call stack,而是导致当前函数退出,就好像已经到达函数块的末尾一样。这会导致当前函数从调用堆栈中移除。

      因此,在无条件返回语句之后编写的任何代码都无法访问并且永远不会被执行。

      【讨论】:

      • 具有非 void 返回类型的函数必须返回值是不正确的。 C 标准允许控制流到函数的末尾,然后控制返回给调用者。 (如果调用函数尝试使用返回值,则行为未定义。)这对于有时返回值有时不返回值的函数很有用,例如执行由请求代码指定的操作的函数,以及某些请求可能会设置值而不返回任何内容,而其他人则检索值并返回它们。
      • 另外,main 是特殊的;它不必有一个return 语句来返回一个值。如果控制到达main 的末尾,则返回零。
      • @EricPostpischil:我清楚地记得我的 Microsoft 编译器在并非函数的所有控制路径都返回值时抱怨。但是,编译器可能处于 C++ 模式(不是 C),我不确定这是编译器错误还是警告。此外,它可能是一个非常旧的编译器版本。 C 和 C++ 在这方面有什么区别吗?标准可能在这方面发生了变化?
      • 编译器可能会发出警告,因为这种用法很少见,但在为标准 C 编译时应该允许它。不同的编译器开关可能会影响这一点。在 C++ 中,行为是未定义的:C++ 2017 草案 n4659 9.6.3 “return 语句”[stmt.return] 2 说“……否则,流出除 main (6.6.1) 以外的函数的末尾会导致未定义的行为。” (“否则”后面是关于返回类型为 void 的函数的句子,因此这句话是关于返回类型为非 void 的函数。)
      • @EricPostpischil:感谢您提供的信息。我现在已经删除了包含不正确信息的段落。我花了将近两年的时间才这样做,但迟到总比没有好。 :-)
      猜你喜欢
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      相关资源
      最近更新 更多