【问题标题】:Wrong returned value in main function?主函数返回值错误?
【发布时间】:2019-11-07 16:46:52
【问题描述】:

我之前读过 C 语言中的 0 表示假,而 1 表示真。 并且注意到 main 函数返回 0 但为什么呢?如果我的所有代码都成功运行,它应该返回 true (1)。 另一个相关的问题,我还是不明白谁可以使用returnable value?因为在我的程序中没有其他函数调用主函数,所以没有人知道我的程序是否运行良好。 我有点困惑。

【问题讨论】:

  • OS 询问 main.. 有什么问题吗?它返回错误代码 0.. 表示没有错.. 另外,谁可以使用返回的值?父进程可以..例如,如果您创建一个子进程并且它返回-1或其他值,则父进程可以知道它没有履行职责。
  • 你的程序失败了吗?不,它没有......所以它返回零(又名假)
  • 如果错误发生,则基本上 main 返回一个整数错误代码,否则为零(=NO ERROR ALL FINE)。如果在布尔表达式中这样使用,C 仍然将 1 解释为真,将 0 解释为假
  • C 函数返回 true/false 表示成功不是常见的约定。成功时返回 0 或失败时返回错误代码更为常见。

标签: c function main


【解决方案1】:

如果main 的返回值被解释为布尔值,您的逻辑将是有意义的,但事实并非如此。从初始调用返回到main 就像调用exit 函数:它向您正在运行的系统报告终止状态。

标准 C 指定了 3 种可移植退出状态:

  • 0,表示成功
  • EXIT_SUCCESS,也表示成功
  • EXIT_FAILURE,表示失败

(最后两个是<stdlib.h>中定义的宏。)

在 Unix 上,允许任何 8 位值 (0 .. 255)。所有非零值都被解释为错误代码。对于任何给定数字的含义,没有通用约定,只是 0 代表成功,其他任何东西都代表某种失败。

至于谁可以使用返回值:在Unix上,父进程可以使用waitwaitpid来获取终止子进程的退出状态。


在 C 标准库中,执行操作的函数通常不返回真/假状态。 (islowerisdigit 之类的测试可以,但它们没有任何其他效果。)例如,remove(删除文件)在成功时返回 0,在错误时返回 -1。这也是 Unix 系统调用的常见模式。例如,open 成功返回文件描述符(非负整数),-1 出错。

【讨论】:

    【解决方案2】:

    这基本上是@Brandon 在 cmets 中已经说过的。

    main 应该返回程序的exit/error code。在 Unix 约定中,0 用于表示没有错误(错误值为“false”)。然后用正值表示有错误,是什么错误。

    【讨论】:

    • 从未将 0 视为“错误值为假”。这是一种很好的思考方式。
    • 不仅仅是积极的价值观。但也有负值。我已经看到程序在被杀死时返回 -9 或 -1 等 :) 但无论如何,我 +1。
    • @Brandon 不在 Unix 上。
    • 还值得一提的是,如果您不指定返回值,这是唯一一个返回 0 的函数,并且它会从块的末尾脱落。
    【解决方案3】:

    这实际上只是你在程序完成时提出的那种问题。

    案例一:

    你失败了吗?

    案例 2:

    你通过了吗?

    在第一种情况下,“好程序”将返回 false(也称为零)

    在第二种情况下,“好程序”将返回 true(也就是非零)。

    共识是使用案例 1,即“你失败了吗?”。因此,非失败程序返回零表示“我没有失败”。

    这种方法的好处是可以使用非零值来表示不同类型的故障,而零总是“没有故障”

    【讨论】:

      【解决方案4】:

      C 语言认为true(非零)或false(零)与操作系统的值之间存在差异用于表示正常的程序终止。

      严格来说,C 程序应该以EXIT_SUCCESS 的代码退出正常程序终止或EXIT_FAILURE 异常终止。 EXIT_SUCCESS 将映射到底层平台用来指示成功的任何代码,可能是也可能不是 0

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-28
        • 2011-03-15
        • 2020-11-22
        • 2019-05-02
        • 2019-04-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多