代码之家  ›  专栏  ›  技术社区  ›  Pragmateek

为什么main的默认返回值是0而不退出成功?

  •  21
  • Pragmateek  · 技术社区  · 15 年前

    ISO 1998 C++标准规定,不显式地使用主体中的返回语句等效于使用。 return 0 . 但是如果一个实现有一个不同的标准“无错误”代码,例如 -1 ?

    为什么不使用标准宏 EXIT_SUCCESS 也可以用 0 - 1 或者其他值取决于实现?

    C++似乎迫使程序的语义,而不是语言的作用,它只描述程序的行为。此外,“错误”返回值的情况不同:仅 EXIT_FAILURE 是标准的“错误”终止标志,没有显式值,例如“1”。

    这些选择的原因是什么?

    9 回复  |  直到 9 年前
        1
  •  34
  •   Yu Hao    11 年前

    从返回零 main() 基本上和你要求的一样。从返回零 主体() 不必向主机环境返回零。

    从C90/C99/C++98标准文献看:

    如果状态值为零或 EXIT_SUCCESS ,将返回状态成功终止的实现定义形式。

        2
  •  18
  •   Bastien Léonard    15 年前

    事实上, return 0 不一定返回0!我在这里引用C标准,因为这是我最了解的。

    关于 return 在里面 main() :

    5.1.2.2.3程序终止

    如果主函数的返回类型与 int ,从初始调用返回到 main 函数等价于调用 exit 函数返回的值 主要的 函数作为其参数;

    关于 exit() :

    7.20.4.3退出功能
    简介

    #include <stdlib.h>
    void exit(int status);
    

    […]
    最后,控制权返回到主机环境。如果值 status 为零或 EXIT_SUCCESS ,状态的实现定义形式 成功终止 是 返回。

        3
  •  5
  •   Otávio Décio    15 年前

    标准只是在没有明确设定值的情况下确定值的大小。开发人员要么显式地设置返回值,要么为默认值采用适当的语义。我不认为该语言试图将任何语义强加于开发人员。

        4
  •  4
  •   jkp    15 年前

    0是所有POSIX系统和我认识的所有系统上的标准(成功)退出代码!我认为这就是sinc时代开始的方式(或者至少从unix开始…)所以我会说是出于这个原因。

    你知道什么系统是不同的?

        5
  •  3
  •   ire_and_curses    15 年前

    0作为成功的返回代码,postive integer作为错误是C和Unix中的标准。之所以选择这个方案,是因为通常情况下人们不关心程序的原因 成功 就这样。另一方面,有很多方法可以使程序因错误而失败,人们经常对这些信息感兴趣。因此,使用标量值表示成功是有意义的,使用一系列值表示错误也是有意义的。使用正整数是一种节省内存的C约定,因为它们允许将错误代码定义为无符号整数。

        6
  •  2
  •   Yu Hao    11 年前

    OS/360和后续程序使用数字退出代码, 0 通常是成功, 4 对于警告(例如生成警告消息的编译器), 8 为了错误,以及 12 特别严重的错误 (例如无法打开标准输出单元sysprint)。

        7
  •  1
  •   David Thornley    15 年前

    计算机语言标准规定了用这种语言编写的程序必须做什么,以及将要发生什么。在这种情况下,C和C++标准说,返回0个信号成功,除其他事项外。

    语言实现允许程序在特定的实现上运行。实现人员的工作是找出如何使I/O按照标准工作,或者给操作系统提供正确的结果代码。

    程序所做的和操作系统所看到的不一定是相同的事情。所有必要的是程序在给定的操作系统上按照标准所说的方式工作。

        8
  •  1
  •   набиячлэвэли    11 年前

    通过浏览 cstdlib 最后我写了两行:

    #define EXIT_SUCCESS 0
    #define EXIT_FAILURE 1
    

    所以 EXIT_SUCCESS 等于 0 EXIT_FAILURE 等于 1 也就是说没关系,想。

    在Linux(OpenSUSE)上进行了检查,结果得到了相同的结果。

        9
  •  0
  •   fortran    15 年前

    如果您也在考虑为什么成功的错误代码是0而不是任何其他值,我会补充说,它可能是历史上的性能原因,因为与0相比,速度明显更快(我认为在现代体系结构中可能与任何数字相同),而且通常您不检查特定的错误代码,只是我如果这是成功或任何错误(因此使用最快的比较是有意义的)。