🔷 第二章 C++语言基础
📄 一句话概括

函数干完活要"交差",交回去的那个结果就叫返回值。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:亲手把退出码挖出来

  1. 新建 exitcode.cpp:
#include <iostream>
using namespace std;

int main() {
    cout << "我要开工了" << endl;
    return 7;              // 故意交个"非零"
}
  1. F11 编译,然后在 PowerShell 里进入工程目录执行:
cd D:\Dev-Cpp\你的工程目录
.\exitcode.exe
$LASTEXITCODE

看到什么算成功:屏幕上显示"我要开工了",紧接着 $LASTEXITCODE 输出 7——这就是刚才那个 return 7 交出去的数字。

  1. 再把 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 虽然合法,但教材和绝大多数项目都写全——它明确表达了"我知道程序成功时该返回什么"。

五、常见误区

  1. "return 0; 会在屏幕上显示一个 0"——不会。返回值走的是"幕后通道",跟你用 cout 输出是两回事(这也是本节最容易搞错的一点)
  2. "非 0 一定是 bug"——不一定,是"程序自己报告的失败"。比如 return 1 表示"文件没找到",return 2 表示"参数不对"——由你的程序定义并写进文档
  3. "return 后面的代码也会执行"——不会。return 一执行,函数立刻结束;后面的语句称为"不可达代码",属于逻辑错误
  4. "所有函数都不写 return 也行,反正 main 可以"——只有 main 有这个特权(标准特例)。普通函数该返回不返回,行为是未定义的,拿到什么值全看运气
自测四问(点开对答案) 1. `return` 做了哪两件事?——**交回一个值**给调用者,同时**立即结束当前函数**。 2. `main` 的返回值给了谁?`0` 表示什么?——交给**操作系统**(退出码);`0` 约定表示**正常结束**,非 0 表示失败。 3. 为什么在 Dev-C++ 里看不到那个 0?——因为它不是屏幕输出,而是走"后台通道"交给系统;要用命令行(`$LASTEXITCODE` / `%ERRORLEVEL%`)才能看到。 4. 哪个函数可以不写 `return`?——只有 `main`(编译器自动补 `return 0;`),其他有返回类型的函数必须写。

相关笔记