新闻详情

新闻详情

首页 / 资讯中心 / 详情

C 语言 main 函数为什么要写 return 0?简要了解main函数到底是什么

发布时间:2026/10/2 13:57:07来源:尧图网络
C 语言 main 函数为什么要写 return 0?简要了解main函数到底是什么
参考Andrew Koenig《C 陷阱与缺陷第二版》3.10节目录书里的三个判断书给的两个写法main 不写 return真的返回垃圾吗可以写char main吗main的递归调用必须要写int mainvoid吗main的参数作者在 3.10 节开头给了最简单的 C 程序main() { }然后说这个程序包含一个不易察觉的错误。错在哪书里的三个判断第一返回类型默认是 int。函数 main 与其他任何函数一样如果并未显式声明返回类型那么函数返回类型就默认为是整型。但是这个程序中并没有给出任何返回值。main()没写int编译器按int处理。既然声明成 int就该有东西返回。可函数体里一句return都没有。但实测编译器并不会给出提醒VS2022。第二通常情况下这没事。通常说来这不会造成什么危害。一个返回值为整型的函数如果返回失败实际上是隐含地返回了某个垃圾整数。只要该数值不被用到就无关紧要。注意只要该数值不被用到这个前提。第三main 的返回值恰恰是会被用到的。然而在某些情形下函数 main 的返回值却并非无关紧要。大多数 C 语言实现都通过函数 main 的返回值来告知操作系统该函数的执行是成功还是失败。典型的处理方案是返回值为 0 代表程序执行成功返回值非 0 则表示程序执行失败。如果一个程序的 main 函数并不返回任何值那么有可能看上去执行失败。……书里举的场景是软件管理系统——比如 make它靠这个值决定下一步走不走。程序明明跑成功了退出码却是个垃圾数make 那边就当成失败。书给的两个写法严格说来我们前面的最简单的 C 程序应该像下面这样编写代码main() { return 0; }或者main() { exit(0); }书里最后补上了经典的 hello world#include stdio.h main() { printf(hello world\n); return 0; }到这里书讲完了总结就是main 的返回值是给操作系统看的0 表示成功非 0 表示失败。下面继续探究一下main函数。main 不写 return真的返回垃圾吗在 VS 2022 上实测四种写法x64Debug / Release 都是这个结果写法进程退出码int main() { }0void main() { }0int main() { printf(hi\n); }0void main() { printf(hi\n); }0全是 0连不标准的void main()也一样。这是为什么呢C991999 年起标准明文规定main 的返回类型与 int 兼容时走到结尾的}等价于return 0。编译器照着这条规则替你补上了那句return。但别急着说书错了。把 main 换成一个普通函数再试#include stdio.h int f(void) { } int main(void) { printf(f() %d\n, f()); return 0; }Debug (/Od) - f() -2008539640 Release (/O2) - f() 0VS 2022 同时给一条warning C4716: f: 必须返回一个值。里没有任何语句给返回值赋过值函数就退出了。所以调用方拿到的是上一次函数调用留在那儿的东西。把 f 改一行让上一次留下的东西露出来int f(void) { printf(in f\n); }Debug (/Od) - in f f() 5 Release (/O2) - in f f() 0Debug 下是5——printf返回写了几个字符in f\n正好 5 个。f 没打算返回什么就把上一个调用的结果原样交了出去。Release 下变成 0因为优化器重排了代码那个 5 不再留在返回值该在的位置上。同一个 bug两种配置两个数。这才是垃圾二字的含义值是多少不重要它根本没打算给一个值。所以书说的隐含返回垃圾整数在普通函数上完全成立只有 main 被特殊照顾。可以写char main吗#includestdio.h char main(void) { printf(1); return a; }实测是可以的 返回值是97 也就是‘a’的ASCII码但不建议这么写是“无厘头”的做法main的递归调用#include stdio.h int main() { static int cnt 0; cnt; printf(cnt%d\n, cnt); if (cnt 3) main(); return 0; }可以替代一个简单的循环但不建议这么做栈会累积容易栈溢出可读性极差别人读代码会很迷惑必须要写int mainvoid吗C 里int main()的空括号意思是“参数表未指定”​不是无参数。#include stdio.h int main() { static int cnt 0; cnt; printf(cnt%d\n, cnt); if (cnt 3) main(100, 200, 300); return 0; }这种情况下即使传了没用的参数也不会报错#include stdio.h int main(void) { static int cnt 0; cnt; printf(cnt%d\n, cnt); if (cnt 3) main(100, 200, 300); return 0; }如果这样写就会报错区别就在这里。main的参数我们通常是这样写int main(void) { }看似main是没有参数的但实际上是有的——int main(int argc, char *argv[])至于为什么以及这代表什么。这里就不讨论了因为我没搞明白
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

从对话到下单:Agent 驱动的用户转化落地实践 2026/10/2 13:57:02

从对话到下单:Agent 驱动的用户转化落地实践

背景 一般的 Agent 记忆系统,应用场景大多是:记住上下文、记住偏好、记住上次聊到哪了,但记忆系统的本质能力:对用户持续建模、把碎片信号沉淀为结构化理解。 因为记忆系统其实和做转化链路解决的是同一个问题:把用户…

阅读更多 →
RTThread学习记录13——关于要使用一个外设,RTThread与cubemx到底要怎么配合? 2026/10/2 13:57:02

RTThread学习记录13——关于要使用一个外设,RTThread与cubemx到底要怎么配合?

一、遇到的问题我学习RTThread到IO设备模型时,先是学习了怎么使用UART和PIN设备,再学习了ADC和PWM这种外包型外设,就遇到一个疑惑,为什么突然到初始化ADC时就要使用到cubemx生成代码了?为什么生成代码之后要放到board.…

阅读更多 →
AI Agent Harness Engineering 降本增效实战:TaoToken 统一 Key 下的成本分析与优化策略 2026/10/2 13:57:02

AI Agent Harness Engineering 降本增效实战:TaoToken 统一 Key 下的成本分析与优化策略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
IIoT 都还没搞明白,EIoT 又来了:一文讲透具身智能物联网与工业物联网的本质区别、产业现状与从业者破局路线 2026/10/2 13:57:02

IIoT 都还没搞明白,EIoT 又来了:一文讲透具身智能物联网与工业物联网的本质区别、产业现状与从业者破局路线

IIoT 都还没搞明白,EIoT 又来了:一文讲透具身智能物联网与工业物联网的本质区别、产业现状与从业者破局路线 核心结论先给你:IIoT(工业物联网)和 EIoT(具身智能物联网)根本不是同一件事的升级版,而是两个不同的物种。IIoT 的本质是"让物会说话"——连接、采集、优化;…

阅读更多 →
LangChain 接入 Jev 架构全解析 2026/10/2 13:56:56

LangChain 接入 Jev 架构全解析

做过 Agent 的都有体会:Agent 干活的本质是一个循环:LLM 决策、工具执行、模型评估、再继续,直到任务完成。问题是,这个循环里每一次「决策」都要完整调一次大模型,又慢又贵。 LangChain 官方博客刚发了一篇文章&…

阅读更多 →
1688 陪跑模式复盘:为什么部分店铺首月即可实现询盘增长,拆解这套运营闭环 2026/10/2 13:56:56

1688 陪跑模式复盘:为什么部分店铺首月即可实现询盘增长,拆解这套运营闭环

摘要:不少工业品商家接触 1688 陪跑模式,很好奇为什么有些项目仅一个月就出现询盘、店铺权重明显改善。本文结合减震器、机械设备两类工厂店铺案例,拆解 “诊断‑带教‑护航” 的完整闭环逻辑,区分代操作与带教式陪跑差异&#xf…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉