return 0是给操作系统返回的退出码,表示程序正常结束;它被父进程(如shell)通过$?获取,用于自动化判断执行结果,非零值则代表不同错误类型。

return 0; 是给操作系统看的退出码,不是给你的代码用的
它唯一作用是告诉调用这个程序的环境(比如 Shell、批处理脚本或另一个进程):“我运行完了,且没出错”。这个值不会影响你程序内部逻辑,也不会被上层 C++ 代码捕获或使用。如果你在 main 函数里写 return 0;,等价于让操作系统收到状态码 0;不写,C++11 起标准也默认补上——但显式写更清晰、更可移植。
不写 return 0; 有时会触发警告甚至编译错误
某些编译器(如 GCC 或 Clang 在 -Wall 或 -Wreturn-type 下)会对没有返回值的 int main() 报 warning;MSVC 在严格模式下也可能报错。尤其当 main 里有分支逻辑时,容易漏掉某个路径的 return:
- if/else 分支中只在 else 里写了
return 0;,而 if 分支末尾没写,就可能未定义行为 - 用了
exit(0)或throw提前退出,但忘了在函数末尾补return,静态分析工具可能误判 - 函数签名是
int main(int argc, char* argv[]),却写了void main()—— 这本身就不合法,return 0;也救不了
return 0 和 return 1 的区别不只是“对错”,而是可被自动化脚本消费
Shell 中可以用 $? 拿到上一个命令的退出码,所以真实工程里这个值是有实际用途的:
-
./myapp && echo "success":只有myapp返回0,才会执行echo -
if [ $? -eq 0 ]; then ... fi:CI 脚本靠它判断构建步骤是否通过 - 返回
1、2、255等不同非零值,可以区分错误类型(比如1表示文件打开失败,2表示参数解析错误) - 建议用
EXIT_SUCCESS和EXIT_FAILURE宏代替裸数字,提升可读性与跨平台兼容性
return 0; 不等于程序没崩溃,也不保证资源完全释放
它只代表 main 函数正常返回,不等于整个程序安全结束:
立即学习“C++免费学习笔记(深入)”;
- 如果程序在
return 0;前已触发段错误(SIGSEGV)、被 kill -9 终止,或调用了std::abort(),根本不会执行到这行 - 全局对象析构、
atexit注册函数仍会在return 0;后运行;但如果程序中途exit(0),则跳过局部对象析构(但依然执行atexit) - 有线程仍在运行时直接
return 0;,主线程退出后进程可能立即终止,其他线程被强制杀死——这不是return 0;的问题,而是并发控制没做好
真正容易被忽略的是:退出码是操作系统接口层的契约,不是 C++ 语言特性。哪怕你把 return 0; 写得再漂亮,只要程序在返回前崩了,这个值就永远发不出去。


















