return 是 C 语言中一个至关重要的关键字,它主要有两大核心功能,并且其行为会根据函数类型(有返回值函数 vs 无返回值函数)有所不同。

(图片来源网络,侵删)
核心作用总结
- 从函数中退出:立即终止当前函数的执行,并将程序的控制权交还给调用该函数的地方。
- 返回一个值:将一个值从被调用函数传递回调用函数,这个值被称为“返回值”。
可以把函数想象成一个工厂车间,return 语句就像是车间完成生产后,把成品(返回值)和一份“任务完成,可以离开了”的指令一起送回给总调度(调用函数)。
两大核心功能详解
功能 1:从函数中退出(Return as an Exit)
return 语句一旦执行,函数体内 return 语句之后的所有代码都将不会被执行,这提供了一种提前退出函数的机制。
示例 1:在找到目标后提前退出
#include <stdio.h>
// 在数组中查找一个数字,如果找到就返回其索引,否则返回 -1
int findNumber(int arr[], int size, int target) {
for (int i = 0; i < size; i++) {
if (arr[i] == target) {
printf("找到数字 %d 在索引 %d\n", target, i);
return i; // 找到目标,立即返回,循环和函数都结束
}
}
// 如果循环结束都没有找到,执行到这里
printf("未找到数字 %d\n", target);
return -1; // 返回一个特殊值表示未找到
}
int main() {
int numbers[] = {10, 20, 30, 40, 50};
int size = sizeof(numbers) / sizeof(numbers[0]);
int index1 = findNumber(numbers, size, 30);
int index2 = findNumber(numbers, size, 99);
return 0;
}
分析:

(图片来源网络,侵删)
- 在
findNumber函数中,当i=2时,arr[2]等于30,条件if (arr[i] == target)成立。 return i;语句被执行,函数立即返回2,并将控制权交回main函数。for循环的剩余迭代以及函数末尾的return -1;都被跳过了。
功能 2:返回一个值(Return a Value)
这是 return 最广为人知的功能,它将一个表达式的计算结果传递给函数的调用者。
关键规则:
- 返回值类型必须匹配:函数定义时声明的返回类型,必须与
return语句后面表达式的类型兼容(或可以自动转换)。 - 必须有
return语句:对于一个声明了返回类型(非void)的函数,必须保证在所有可能的执行路径上都有return语句,否则可能导致未定义行为。
示例 2:计算两个数的和
#include <stdio.h>
// 这个函数声明将返回一个整数
int add(int a, int b) {
int sum = a + b;
return sum; // 返回 sum 变量的值
}
int main() {
int result = add(5, 3); // 调用 add 函数,并将返回值赋给 result 变量
printf("5 + 3 = %d\n", result); // 输出: 5 + 3 = 8
return 0;
}
分析:

(图片来源网络,侵删)
add函数被声明为返回int类型。return sum;将sum的值(在这个例子中是8)传递回main函数。main函数中的int result = add(5, 3);接收了这个返回值,并将其存储在result变量中。
不同类型函数中的 return 用法
return 的行为会根据函数的返回类型而变化。
有返回值的函数 (Non-void Functions)
这类函数在声明时指定了返回类型(如 int, float, char, double 等)。
- 必须有
return语句:编译器会检查是否所有代码路径都有返回。 - 返回值类型必须匹配:
return的值类型应与函数声明的返回类型一致。
示例 3:返回值类型检查
// 正确:返回 int 类型
int getInt() {
return 100; // 正确
}
// 错误或警告:返回类型不匹配(在 C++ 中是错误,在 C 中可能产生警告)
double getDouble() {
return 3.14; // 函数声明为返回 double,但返回的是 double 字面量,这是正确的。
// 如果返回 int,编译器可能会警告或进行隐式转换。
}
无返回值的函数 (Void Functions)
这类函数在声明时使用 void 关键字,表示函数不返回任何值。
return语句是可选的:如果函数执行到末尾自然结束,可以没有return语句。return语句不带任何值:如果使用return,它后面不能跟任何表达式或值,其唯一作用就是提前退出函数。
示例 4:void 函数中的 return
#include <stdio.h>
// 这个函数不返回任何值
void printMessage(const char* message) {
if (message == NULL) {
printf("错误:消息为空!\n");
return; // 提前退出函数,不执行下面的打印
}
printf("消息内容: %s\n", message);
// 函数在这里自然结束,可以省略 return;
}
int main() {
printMessage("你好,世界!"); // 输出: 消息内容: 你好,世界!
printMessage(NULL); // 输出: 错误:消息为空!
return 0;
}
分析:
printMessage函数是void类型,所以它的return语句(如果存在)不能带值。return;在这里的作用是:当检测到message为NULL时,立即终止函数,防止程序继续执行可能导致错误的printf。
常见误区与最佳实践
-
忘记
return- 问题:对于一个非
void函数,如果在某个逻辑分支中没有return,会导致编译器警告或错误。 - 示例:
int getGrade(int score) { if (score >= 90) return 'A'; if (score >= 80) return 'B'; // score 是 70 呢?函数会在这里“掉下去”,没有返回值。 } - 解决:确保所有路径都有返回,或者提供一个默认的
return。int getGrade(int score) { if (score >= 90) return 'A'; if (score >= 80) return 'B'; return 'C'; // 提供一个默认返回值 }
- 问题:对于一个非
-
在
void函数中返回值- 问题:在
void函数中使用return value;会导致编译错误。 - 示例:
void showError() { return 1; // 错误!void 函数不能返回值 } - 解决:移除
return后面的值。
- 问题:在
-
混淆
return和printf- 问题:初学者有时会误以为
printf会返回什么值,或者用return来打印信息。 - 分析:
printf的返回值是成功打印的字符数,通常我们并不关心它。return的作用是返回控制权和数据,而不是打印,打印信息应该用printf或其他 I/O 函数。
- 问题:初学者有时会误以为
总结表格
| 函数类型 | return 语句是否必须 |
return 后面是否可以跟值 |
主要作用 |
|---|---|---|---|
| 有返回值 (e.g., int, float) |
是,必须保证所有路径都有 | 是,且值类型需匹配 | 返回一个值给调用者 终止函数执行 |
| 无返回值 ( void) |
否,是可选的 | 否,不能跟任何值 | (可选)提前终止函数执行 |
return 是 C 语言函数机制的核心,它不仅是数据传递的通道,也是程序流程的控制点,正确理解和使用 return 是编写健壮、清晰的 C 代码的基础。
