📄 一句话概括
函数干完活要"交差",交回去的那个结果就叫返回值。main 的返回值交给操作系统:约定 0 =一切正常,非 0 =出了岔子(具体数字的含义由程序员自己约定)。三个要点:return 一执行,函数立刻结束(后面的代码跑不到);普通函数的返回值交回给调用它的地方;main 里省略 return 0 编译器会自动补,但写全才是好习惯。
一、return 干两件事
return 0;
// ↑ ① 交回的值 ↑ ② 结束整个函数
先看②"结束函数"这个作用——容易被忽略但非常重要:
int main() {
cout << "第一句" << endl;
return 0; // ← 到这里函数就结束了
cout << "这句永远不会显示" << endl; // ← 死代码,编译器可能警告
}
再看①"交回值"——它交回给谁,取决于函数被谁调用:
| 函数 | 返回值交给谁 | 谁在关心它 |
|---|---|---|
main |
操作系统 | 脚本、批处理、任务计划程序、CI 流水线 |
| 自己写的普通函数 | 调用它的那行代码 | 你自己的程序逻辑 |
二、main 的返回值:退出码(exit code)
你双击 hello.exe
↓
程序跑完,把 return 的那个数交给 Windows
↓
Windows 把它记下来,叫做"退出码 / 错误级别"
↓
后面的脚本一查这个数字,就知道"刚才那个程序干成了没有"
约定:
| 值 | 含义 |
|---|---|
0 |
成功(约定俗成,几乎所有系统都这么认) |
1、2、-1、404… |
各种失败;含义由程序员自己定,写文档告诉别人 |
为什么 Dev-C++ 里看不出来:你按 F9 运行,看到的是黑窗口里的输出文字。那个"0"不会显示在屏幕上——它走的是"幕后通道"。想看它,得用命令行。
三、动手 Demo:亲手把退出码挖出来
- 新建
exitcode.cpp:
#include <iostream>
using namespace std;
int main() {
cout << "我要开工了" << endl;
return 7; // 故意交个"非零"
}
F11编译,然后在 PowerShell 里进入工程目录执行:
cd D:\Dev-Cpp\你的工程目录
.\exitcode.exe
$LASTEXITCODE
看到什么算成功:屏幕上显示"我要开工了",紧接着 $LASTEXITCODE 输出 7——这就是刚才那个 return 7 交出去的数字。
- 再把
return 7;改成return 0;,重新编译运行,$LASTEXITCODE变成 0。
30 秒实验:在 PowerShell 里执行 .\exitcode.exe; if ($LASTEXITCODE -ne 0) { "这个程序出问题了" }——这就是自动化脚本判断程序成败的标准姿势。改一改 return 的值,看提示出不出来。
四、其他函数怎么写 return
int add(int a, int b) { // 函数头声明"返回 int"
return a + b; // 交回一个 int —— 类型必须对得上
}
void sayHi() { // void =不返回任何值
cout << "hi" << endl;
return; // void 函数里可以只写 return; 表示提前结束
}
| 函数类型 | return 要写什么 | 不写会怎样 |
|---|---|---|
int / double 等 |
必须有(且类型匹配) | 行为未定义(可能拿到垃圾值) |
void |
可以不写;写就是 return; |
跑到右花括号自动结束 |
main |
可以省略(编译器自动补 return 0;) |
这是 C++ 给 main 的特例,别指望别的函数也有 |
注意:main 省略 return 0 虽然合法,但教材和绝大多数项目都写全——它明确表达了"我知道程序成功时该返回什么"。
五、常见误区
- "
return 0;会在屏幕上显示一个 0"——不会。返回值走的是"幕后通道",跟你用cout输出是两回事(这也是本节最容易搞错的一点) - "非 0 一定是 bug"——不一定,是"程序自己报告的失败"。比如
return 1表示"文件没找到",return 2表示"参数不对"——由你的程序定义并写进文档 - "
return后面的代码也会执行"——不会。return一执行,函数立刻结束;后面的语句称为"不可达代码",属于逻辑错误 - "所有函数都不写
return也行,反正 main 可以"——只有main有这个特权(标准特例)。普通函数该返回不返回,行为是未定义的,拿到什么值全看运气
自测四问(点开对答案)
1. `return` 做了哪两件事?——**交回一个值**给调用者,同时**立即结束当前函数**。 2. `main` 的返回值给了谁?`0` 表示什么?——交给**操作系统**(退出码);`0` 约定表示**正常结束**,非 0 表示失败。 3. 为什么在 Dev-C++ 里看不到那个 0?——因为它不是屏幕输出,而是走"后台通道"交给系统;要用命令行(`$LASTEXITCODE` / `%ERRORLEVEL%`)才能看到。 4. 哪个函数可以不写 `return`?——只有 `main`(编译器自动补 `return 0;`),其他有返回类型的函数必须写。- ☑ 注释