【问题标题】:use of return 0; in main() in C [duplicate]使用返回 0;在 C 中的 main() [重复]
【发布时间】:2014-07-20 09:48:23
【问题描述】:

我正在阅读 Brian Kernighnan 和 Dennis Ritchie 的 Programming in C (第 25 页底部)

作者在此引用:

power计算的值通过return语句返回给main。任何表达式都可以跟在 return 后面:return expression ;

但是在他上面提供的代码中:

#include <stdio.h>
int power(int m , int n);

main()
{
    int i;
    for (i = 0; i < 10; ++i)
    printf ( " %d \t %d \t %d \n ", i, power( 2 , i), power( -3 , i));
    return 0;//no. 1
}

int power(int m , int n)
{
    int i, p ;
    p = 1;
    for (i = 1; i <= n; ++i)
    p = p * m;
    return p; //no. 2
}

这里我明白了他为什么在函数幂中使用 2.return p;(即获取 p 的值),但他为什么使用 1.return 0;? 我尝试删除行 return 0; 并且它仍然像我想的那样工作,是我遗漏了什么吗??

[更新] 很抱歉之前没有包括在内,但我已经知道很多了:
书中引用:

您可能已经注意到,在末尾有一个 return 语句 主要的。由于 main 和其他函数一样,它可能会返回一个值 到它的调用者,这实际上是程序所在的环境 被处决。通常,返回值为零意味着正常 终止;非零值表示异常或错误终止 状况。为了简单起见,我们省略了 return 到目前为止,我们的主要功能的陈述,但我们将 以后包括它们,以提醒程序应该返回 环境的状态。

感谢@Pascal,我能够理解 return p; 的区别。并返回 0; 然而,我的意图是永远不知道返回 0 是什么;但是为什么用return也是为了知道return语句的区别……

【问题讨论】:

  • 表示程序运行没有任何问题。通常,当程序遇到错误或问题时,会返回一个非 0 的整数,以向用户指示发生了错误。
  • 我认为不应将 C 函数作为 C++ 函数的副本关闭,尤其是在这两种语言之间存在细微差别的情况下。
  • @PascalCuoq 我理解 C 和 C++ 不一样,但我认为“重复”问题的答案完美地描述了 OP 想要知道的内容 - main() 中的 return 语句是什么对于,因此我认为将其标记为重复是合适的
  • @TimCastelijns 我不知道我的英语不好是什么大惊小怪,但我想知道回报 p 有什么不同;并返回 0;我也是一个初学者,我不明白我自己的代码是什么意思,你希望我理解别人的代码??有点同情……
  • 没什么大惊小怪的。我将您的问题标记为重复,因为(除了语言差异)它几乎是完全重复的,而另一个问题有一个很好的答案,也适用于您的问题。我不是坏人,我只是想帮忙

标签: c function return


【解决方案1】:

main() 的返回码通常是程序向操作系统指示它们是否成功完成的一种方式。按照惯例,返回值为零表示成功,而其他值用于指示错误。

UNIX/Linux 和 Windows 等操作系统提供了检查此类返回码的方法;在 sh 或 bash 中,$? 保存最后执行的命令的返回码,在 Windows 的 cmd 中,您可以通过 %ERRORLEVEL% 获取它。

【讨论】:

  • 我要补充一点,返回零表示程序执行成功。
  • 当出现问题时编译器本身不会出错吗?例如。如果我错过了一个分号,它会说我缺少一个分号,那么 return 0 有什么用;??
  • @ArchKudo 例如,您可以让您的程序以返回值 1 退出,以指示找不到程序试图打开的文件(这只是一个愚蠢的示例,通常您会在代码中做错误处理,但这只是给你一个想法)
  • @ChrisJ.Breisch:我不确定,但我认为返回零表示程序成功结束是一种约定,并且没有关于它的标准
  • Oo @Tim 但作者说返回 x;是一个计算值,当我键入 return 0 时计算得到的值;在哪里??
【解决方案2】:

如果程序正常运行,每个 C 程序的 main 函数都应该返回 0。这是您应该始终遵守的约定。

【讨论】:

    【解决方案3】:

    在程序入口点以外的函数中,return e; 表示将发送给调用者的结果。


    main() 函数中的return i; 语句是程序向操作系统传达退出代码的一种方式。在 POSIX 中,return 0; 表示成功。

    函数main() 末尾的return 0; 过于敷衍,以至于在C99 中,它被设为可选。根据标准,} 结束函数 main() 的行为类似于 return 0;

    5.1.2.2.3 程序终止

    1 如果主函数的返回类型是与int兼容的类型,则从初始调用主函数返回相当于以主函数返回的值作为参数调用退出函数; 到达终止 main 函数的 } 返回值 0[…]

    但是,在 C90 中,没有这样的例外,在没有 return 语句的情况下,让 int-returning 函数(例如 main())到达最终的 } 在技术上是未定义的行为。在实践中似乎发生的最糟糕的情况是程序在为函数结果保留的寄存器或堆栈槽中返回一个不确定的值,这样操作系统可能会在程序实际成功时认为程序失败了。

    【讨论】:

    • 对不起,我真的不明白你说 C99 和 C90 是什么??
    • @ArchKudo 它们是 C 语言的不同版本
    • "Versions" 这里的东西也被称为 "Dialects"。
    • @ArchKudo C90 是定义 C 语言的最古老的标准,也被称为“ANSI C”。 C99 是 15 年前发布的更新标准。
    • 其实C90也称为ISO C (ISO/IEC 9899:1990)。 ANSI C 最常被称为 C89,因为那是 ANSI 通过标准的时候。除了格式之外,它们是相同的,并且 ISO 标准已被 INCITS 和 ISO/IEC 撤销。
    【解决方案4】:

    根据 ISO/IEC C++ 标准 (14882),第 3.6.1 节规定函数 main 应具有以下两个签名之一:

    int main(void) { .... }
    or
    int main(int argc, char** argv) { .... }
    

    大多数编译器都接受它的变体,例如仅main() { .... } 用于向后比较,例如您的示例代码。 main 末尾的 return 是返回给调用环境(通常是命令 shell)的值,可以用来表示程序成功完成(通过 return 0),或者向调用环境返回错误代码万一出现程序错误。

    如果您在 main 的末尾关闭返回,则假定为 return 0;

    【讨论】:

    • 问题是关于C的。
    猜你喜欢
    • 1970-01-01
    • 2014-02-25
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多