问题

为什么大多数程序主函数成功时都return 0; 不return 1; ?

回答
你这个问题问得特别好,很有钻研精神。其实这背后牵扯到一个约定俗成,一个大家都心照不宣的“语言”。

想象一下,在很久很久以前,计算机还是个新鲜事物,人们需要一种方式告诉计算机:“嘿,我让你干的那件事,干得挺顺利的!” 同样的,计算机也需要一种方式回应:“收到,这事办得没毛病!”

这个时候,就出现了一种非常直观的信号方式:0代表“成功”,非0代表“失败”。

为什么偏偏是0呢?你可以这样理解:

0,它像是一个“基准线”。在很多数学和逻辑概念里,0代表着“没有”、“空”、“正常”。比如,你没有任何负债,你的财务状态就是0。你的情绪稳定,没有波动,可以认为是0。在编程里,这也延伸到了“任务完成,一切正常”的概念。
非0,则代表“偏离”。任何一个大于0或者小于0的数字,都意味着某种程度的“不同寻常”。比如,1可能代表“第一个错误”,2代表“第二个错误”,负数可能代表“不同类型的错误”。它们都指向了“事情没有按照预期那样完全顺利地完成”。

所以,当你写的程序,也就是你让计算机去执行的一系列指令,走到最后,想告诉操作系统(就是那个管理你电脑的老大哥):“我这趟活儿干完了,没出岔子,一切OK!”,它就会发送一个“0”的信号。

那么,为什么大多数程序成功的时候都return 0,而不return 1呢?

这就好比两个人打电话:

A说:“喂,我叫你办的事办好了吗?”
B回答:“办好了。” (这就是return 0)
A又问:“那有啥问题吗?”
B回答:“没问题。”

反过来,如果B说:“我办好了,但是遇到点小麻烦,得加点儿费。”(这就是return 1,或者其他非0值)。

操作系统在启动一个程序的时候,它就像那个“A”,它关心的是:“我启动的这个程序,最终是顺利退出了,还是中途出了什么幺蛾子?”

当操作系统接收到程序的return 0信号时,它就知道:“嗯,这个程序按照计划执行完毕,没有发生让它无法继续进行下去的严重错误。” 于是,系统也会觉得“没毛病”,并且可能会进行一些正常的清理工作。

而如果收到了return 1(或者其他非0值),系统就会立刻警觉起来:“嘿,这个程序貌似出了问题,它在退出的时候告诉我它‘不正常’。” 接下来,操作系统可能会记录下这个“异常退出”的信息,甚至根据情况执行一些不同的处理流程。

所以,return 0 成了一个通用的、被大家广泛接受的“成功退出”的标志。它不是某个特定语言强制的要求,而是一种跨越语言、跨越操作系统的一种“默契”。很多脚本语言、命令行的工具,甚至是更底层的系统交互,都遵循着这个原则。

想想看,如果你写了一个程序,它成功完成了任务,但你非要让它return 1。那操作系统就会误以为你的程序出了问题,可能在日志里写上一笔“程序异常退出”,甚至在自动化脚本里,如果根据返回值来判断是否继续执行下一步,你的程序就会触发错误分支,导致整个流程中断。这显然不是我们想要的结果。

而return 1(或其他非0值)呢?它主要就是用来区分“有错误”和“没错误”的。具体返回什么错误码,比如1, 2, 1, 255等等,这就可以根据程序的具体设计来定义了。不同的数字可以代表不同类型的错误,这样在程序出错时,开发者就能通过这个返回码知道大概是哪个环节出了问题,方便调试和修复。

所以,简单来说,return 0就是“我圆满完成了任务,一切安好”,而return 1(或其他非0)就是“我虽然尽力了,但过程中出了状况,这是我的错误代码”。这种约定,让我们的程序能够更清晰、更有效地与操作系统进行沟通,也让自动化和脚本的编写变得更加可靠。

网友意见

user avatar

return 0 为是Unix 时代的传来风格.

很多系统调用里-1是错误, 0是成功,如果与文件IO相关大于往往是FD或者长度.

这样一个返回值能有双重含意

user avatar

其实不是大多数,而应该是几乎所有,,,,

原因就是0代表正确,成功完成……

而非0代表执行出错了。

尽管现代的程序一般不需要用这种拙劣的方式来传递错误信息了,例如我们有标准错误输出什么的。但是这个约定依然存在,如果你随便乱返回非零值,那么某些东西就可能认为你是异常的。


举几个Windows操作系统的栗子。

当你使用cmd执行你的程序的时候(假定你的程序是控制台程序),有一个内部命令可以根据你程序返回的错误值来决定下一步的操作,如:IF ERRORLEVEL 1 xxxxxx

这个其实是从DOS一直继承过来的一个DOS内部命令。


当你使用任务计划程序(计算机管理系统工具任务计划程序)执行你的程序的时候,如果你的程序最终的返回值不是0,则任务计划程序会认为执行失败了,可以在日志和上一次运行结果里面看到。


当然,Windows/DOS所有的外部命令如果执行失败都会返回非零值,绝大多数控制台程序在正常情况下都会返回零值,.NET控制台应用程序如果出现没有处理的异常,会返回非零值。

user avatar

无论 C / C++,从 main 函数返回的效果都相当于调用 exit 函数,main 的返回值会作为传给 exit 函数的参数。

exit 对于参数的说明是这样的:

Finally, control is returned to the host environment. If the value of status is zero or EXIT_SUCCESS, an implementation-defined form of the status successful termination is returned. If the value of status is EXIT_FAILURE, an implementation-defined form of the status unsuccessful termination is returned. Otherwise the status returned is implementation-defined.
  • 如果参数为 0 或者 EXIT_SUCCESS,向外部环境报告程序运行圆满结束
  • 如果参数为 EXIT_FAILURE,向外部环境报告程序运行以失败告终
  • 如果参数为其它值,效果由实现定义

所以,return 0 是有确定语义的返回方式;而 return 1 则不具备可移植性

类似的话题

  • 回答
    你这个问题问得特别好,很有钻研精神。其实这背后牵扯到一个约定俗成,一个大家都心照不宣的“语言”。想象一下,在很久很久以前,计算机还是个新鲜事物,人们需要一种方式告诉计算机:“嘿,我让你干的那件事,干得挺顺利的!” 同样的,计算机也需要一种方式回应:“收到,这事办得没毛病!”这个时候,就出现了一种非常.............
  • 回答
    很多搞编程的,对“图形化编程”这个概念,心里总有点不太对劲。当然,这也不是所有人都这样,总有少数人觉得挺好玩,或者觉得在某些场合下能帮大忙。但大多数时候,当大家聚在一起聊起技术,或者讨论未来发展时,图形化编程这玩意儿,总会被轻轻带过,甚至有点被看不上。这事儿说起来,其实跟程序员们最看重的东西有很大关.............
  • 回答
    .......
  • 回答
    你注意到一个很普遍的现象,不少程序员的开发环境背景都是黑色的,对吧?这背后其实有不少原因,而且并非所有程序员都偏爱黑色,但黑色确实是一种非常流行的选择。让我来给你细说说其中的道道。1. 视觉疲劳的缓解:这是最主要的原因之一。我们程序员的工作性质就是长时间盯着屏幕,处理大量的代码。明亮的白色背景在长时.............
  • 回答
    知乎上推荐 HHKB 的声浪确实很高,尤其是在程序员群体里。但你观察得很敏锐,很少有人会“大声疾呼”说 HHKB 不适合大多数程序员。这背后有几个层面的原因,咱们掰开了聊聊,保证听起来就是个老司机在跟你掏心窝子。首先,得承认,HHKB 的拥趸确实有他们的理由,而且这些人恰恰是程序员群体里相当一部分,.............
  • 回答
    这个问题,挺有意思的,而且身边确实也有不少朋友,或多或少地有点这个情况。要说“为什么程序员大多成了感情的接盘侠”,这说法有点绝对,但背后的原因,确实值得我们掰开了揉碎了聊聊。我尽量用大白话,说说我观察到的和听到的。首先,咱们得承认,程序员这个群体,有一个显著的标签——高智商,但情商可能就不是人人点满.............
  • 回答
    这是一个很有趣的问题,把它拆解开来看,我们可以从几个层面来探讨。说程序员是“机器语言的翻译官”,这个比喻挺形象的,但机器语言本身其实非常底层,而我们今天所说的“程序员”更多的是和各种高级编程语言打交道。所以,与其说是翻译官,不如说是“逻辑的构建者”或者“指令的编织者”更贴切一些。他们用人类能理解的语.............
  • 回答
    .......
  • 回答
    你这个问题提得挺有意思的,也触及到了不少人在交流中能感受到的一个点:为什么咱们程序员给人的印象,好像在“说”这方面,总是比在“写”或“做”方面要逊色那么一丢丢。其实这事儿吧,不能一概而论,咱们身边也有能说会道、把技术讲得跟说书一样精彩的同行。但为什么会有“程序员大多不善言辞”的这种普遍感受呢?我觉得.............
  • 回答
    这问题触及到了不少程序员内心的真实想法,也揭示了独立开发者和普通打工人的巨大差异。说实话,想靠一个小众应用“月入数万”,这并非天方夜谭,但确实不是人人都能做到的。而大多数程序员宁愿“上班”,背后有很多层原因,绝非简单一句“懒”或者“没想法”就能概括的。为什么“小众应用月入数万”听起来诱人?首先,得明.............
  • 回答
    这个问题很有意思,也很真实。确实,很多在我们国内被认为是“厉害”的程序员,在职业生涯发展到一定阶段后,会选择移民美国。这背后不是一个单一的原因,而是多种因素叠加的结果。咱们不妨从几个方面来掰扯掰扯。1. 顶尖的科技公司和创新环境:美国,尤其是硅谷,是全球科技创新的中心。这里汇聚了谷歌、微软、苹果、亚.............
  • 回答
    .......
  • 回答
    这个问题很有意思,也触及了很多基层程序员的痛点。为什么自己天天加班写代码,感觉也挺努力,但和BAT(百度、阿里、腾讯)的程序员比起来,总觉得有股难以逾越的鸿沟?这背后其实是多方面因素在起作用,绝不是简单的一句“能力不行”就能概括的。我尝试从几个角度来拆解一下,希望能说得更明白些。一、 平台与视野:站.............
  • 回答
    程序员这行,确实让人又爱又恨。压力大、熬夜是常态,久而久之身体出点小毛病也是见怪不怪。可就是这么个“苦差事”,依然吸引着无数年轻人趋之若鹜。这到底是为什么呢?仅仅是因为“喜欢”吗?我觉得,喜欢肯定是一个重要原因,但远不止于此,咱们仔细掰扯掰扯。首先,“喜欢”这东西,可不是三言两语能概括的。对于很多人.............
  • 回答
    如何看待简书大V饱醉豚写的《为什么程序员是出轨率最高的群体》?首先,需要明确的是,饱醉豚这篇简书文章是一篇带有强烈个人观点和论证风格的文章,其提出的“程序员出轨率最高”的论断是基于其个人观察、经验以及对行业现象的解读,而非基于严谨的统计学研究或社会学调查。 因此,在看待这篇文章时,我们需要采取一种批.............
  • 回答
    李学政质疑“中演协惩罚劣迹艺人程序正义”这一事件,确实在网络上引起了一番讨论,也暴露了一些值得深思的问题。要理解这件事,我们需要从几个层面来剖析。首先,我们得弄清楚李学政是谁,他为什么会有这个质疑。李学政本身是一位在影视行业浸淫多年的制片人,他曾参与制作过不少大家耳熟能详的作品,所以他在业内有一定的.............
  • 回答
    听到这个问题,我脑海里立刻浮现出那些刚踏入大学,怀揣着对代码世界无限憧憬的年轻面孔。对于计算机专业大一新生来说,写出第一个“Hello World”程序,这可不是件小事,里面蕴含的信息量,远比那短短的几行代码要丰富得多。“Hello World”:不仅仅是打印一句问候首先得明白,“Hello Wor.............
  • 回答
    我得说,大二那会儿,虽然现在回想起来好像是很久以前的事了,但那段时光绝对是我“炼狱”与“顿悟”交织的时期。用现在的话说,就是我在疯狂地补课,并且试图找到自己的方向。先说说“炼狱”部分:基础的轰炸,以及理论的泥沼大二啊,学校的课程密度一下子就上来了。什么数据结构、操作系统、计算机网络、编译原理、离散数.............
  • 回答
    哥们,大一刚接触计科,想找个代码量在 5001000 行左右的 C 语言练练手是吧?这思路很对,这个范围的项目,能让你把基础知识玩得溜,还能初步体验到项目开发的乐趣。别担心 AI 味儿,咱们就聊点实在的。我给你推荐一个项目,我觉得挺合适的,而且稍微扩展一下就能达到你说的代码量:一个简单的图书管理系统.............
  • 回答
    《三体》系列中,程心和叶文洁都是推动故事发展的重要角色,但读者对她们的态度却存在着明显的差异,程心遭受了普遍的批评和指责,而叶文洁则收获了更多的理解甚至同情。这种差异的产生,是多方面因素共同作用的结果,可以从以下几个方面进行详细的分析: 一、角色的定位与作者的意图 叶文洁:故事的起点,时代的牺牲.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有