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

发布时间:2026/10/1 11:21:47

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[])至于为什么以及这代表什么。这里就不讨论了因为我没搞明白
延伸阅读

更多相关文章

2026/10/1 11:21:47

OpenHarmony仓颉语言实战:拨打电话功能从0到1实现指南

如果你准备在 OpenHarmony 上做一个带拨号功能的应用,而且想把核心逻辑用仓颉来写,那这篇文章应该能帮你少踩几个坑。先说结论:拨打电话这个功能,在 OpenHarmony 上本质上就是构造一个带 tel: 协议的 Want,然后交给系…

2026/10/1 11:21:47

【信息科学与工程学】计算机科学与自动化——第二百零九篇 软件硬件集成开发环境指南01

编号 类型 环境 知识/特性/机制 涉及因素/参数/属性列表 关联知识与标准法规 001 需求/追溯集成机制 软件开发环境/集成的软硬件系统开发环境 把需求条目、用户故事、规格说明、变更请求与设计、代码、测试、缺陷、构建、发布版本建立双向追溯链,形成从“业务目标—系…

2026/10/1 11:21:47

个人开发者单卡实战:从零预训练GPT-2到领域适配全流程

1. 为什么个人开发者也要走一遍LLM全流程很多人一提到大模型,第一反应就是“这玩意儿得几百张卡才能玩”。我一开始也这么想,直到自己用一张RTX 3090把GPT-2级别的模型从零预训练跑通,再做完领域适配,才发现个人开发者的路径和大厂…

2026/10/1 12:31:51

基于Spring Boot的废旧物资预约回收系统:毕设项目全链路解析

每年帮学生复审毕业设计的Java项目,我都会遇到同一类题目:基于Spring Boot的业务管理系统。这次拿到的“瑞回宝废旧物资预约回收系统”比较有代表性——题面是一个环保回收业务,背后却串联了Spring Boot后端开发从项目初始化、数据建模、状态…

2026/10/1 12:31:51

【C++入门】编译链接模型 - 02 预处理把头文件怎样塞进源文件

博主介绍:程序喵大人 35 - 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章,首发gzh,见文末👇&#x…

2026/10/1 12:31:51

MessageBox深度解析:从API参数到封装与高阶应用

做桌面客户端开发这些年,我发现被问得最多的问题不是高深算法,而是 MessageBox(消息提示框)这种看起来人人都会的组件。同事拿着一段弹窗代码来找我:“这个确定按钮点下去,整个界面卡住不动了,到…

2026/10/1 12:31:51

QiLink

QiLink是道息实验室发起的全球首个开源协同协议体系,是整套“道息-气链”双螺旋架构的核心技术工具层,完全由徐玉生原创定义,是连接顶层东方哲学理念与实体产业落地的核心枢纽‌。🔍 名称的专属原创内涵它的命名本身就是独创语义的…

2026/10/1 5:21:14

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/29 21:48:03

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 10:48:55

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑