return 是 C 语言中的一个关键字,它主要有两个核心功能:

(图片来源网络,侵删)
- 从函数中返回一个值。
- 立即终止当前函数的执行,并将程序控制权交还给调用该函数的地方。
下面我们分情况来详细说明。
从函数返回一个值
这是 return 最常见的用法,用于将计算结果传递给函数的调用者。
基本语法
return 表达式;
这里的 表达式 可以是任何合法的 C 语言表达式(如一个变量、一个常量、一个算术运算等),表达式的值会被返回给调用者。
关键点:函数的返回类型
在讨论返回值之前,必须先理解函数的返回类型,在函数定义时,函数名前面的类型(如 int, float, char, void 等)就决定了这个函数返回的值的类型。

(图片来源网络,侵删)
- 如果函数要返回一个值,其返回类型就不能是
void。 - 返回值的类型必须与函数定义时声明的返回类型兼容,如果不兼容,编译器会进行隐式类型转换,但这可能会导致数据丢失或警告。
示例
示例 1:返回一个整数
#include <stdio.h>
// 定义一个函数,其返回类型是 int
int add(int a, int b) {
int sum = a + b;
// 返回 sum 变量的值
return sum;
}
int main() {
int result = add(5, 3); // 调用 add 函数,并将返回值赋给 result 变量
printf("5 + 3 = %d\n", result); // 输出: 5 + 3 = 8
return 0;
}
分析:
int add(int a, int b): 声明add函数会返回一个int类型的值。return sum;: 执行到这一行,add函数停止执行,并将sum的值(8)返回给main函数中的result变量。
示例 2:返回一个浮点数
#include <stdio.h>
// 定义一个函数,其返回类型是 float
float average(float x, float y) {
return (x + y) / 2.0f;
}
int main() {
float avg = average(9.0f, 10.0f);
printf("The average is: %.2f\n", avg); // 输出: The average is: 9.50
return 0;
}
分析:
float average(...): 声明函数返回一个float类型。return (x + y) / 2.0f;: 直接返回一个表达式的计算结果。
终止函数执行
return 的第二个作用是,无论是否返回值,它都会立即结束当前函数的执行。
无返回值的 return
当一个函数的返回类型被声明为 void 时,意味着它不向调用者返回任何值,我们仍然可以在函数内部使用 return 来提前结束函数的执行。
语法
return; // 后面不跟任何表达式
这种 return 通常用于以下情况:
- 在函数开头进行一些错误检查,如果条件不满足,就直接退出。
- 在循环或条件判断中,当某个特定任务完成后,提前结束整个函数。
示例
#include <stdio.h>
// 定义一个无返回值的函数
void print_positive_number(int num) {
// 检查输入是否合法
if (num <= 0) {
printf("Error: Number must be positive.\n");
// 提前终止函数,不执行下面的打印语句
return;
}
// 如果上面的检查通过,才会执行到这里
printf("The positive number is: %d\n", num);
}
int main() {
print_positive_number(100); // 输出: The positive number is: 100
print_positive_number(-5); // 输出: Error: Number must be positive.
return 0;
}
分析:
void print_positive_number(...): 声明这个函数不返回任何值。- 当
num是 -5 时,if条件成立,return;被执行,函数立即停止,printf("The positive number...")这一行代码永远不会被执行。
特殊情况:main 函数中的 return
main 函数是程序的入口,它的 return 有着特殊的意义。
return 0;: 表示程序成功执行并正常退出,这是一种约定俗成的做法,向操作系统(如 Windows, Linux)返回一个状态码,0 通常代表“成功”。return 非0值;(如return 1;): 表示程序在执行过程中遇到了错误或异常,并提前退出,非零值代表“失败”或“错误类型”。
示例
#include <stdio.h>
int main() {
printf("Program starting...\n");
// 模拟一个错误条件
int error_code = 1;
if (error_code != 0) {
printf("An error occurred! Exiting.\n");
return 1; // 向操作系统表示程序异常终止
}
printf("Program finished successfully.\n");
return 0; // 这行代码不会被执行到
}
分析:
- 程序运行到
return 1;时,整个程序就会结束,return 0;之后的代码不会再执行。
return 的常见错误和注意事项
错误 1:在 void 函数中返回值
void my_function() {
int x = 10;
return x; // 错误!不能在返回类型为 void 的函数中返回值
}
编译器会报错:'return' with a value, in function returning 'void'
错误 2:忘记 return(当函数需要返回值时)
int get_max(int a, int b) {
if (a > b) {
return a;
}
// b >= a,函数在这里没有返回值就结束了
// 这是错误的!编译器可能会给出警告
}
这是一个逻辑错误。b 大于或等于 a,函数会执行到末尾而没有 return 语句,这会导致未定义行为(Undefined Behavior),程序可能会返回一个垃圾值,或者导致崩溃。
正确写法:
int get_max(int a, int b) {
if (a > b) {
return a;
}
return b; // 确保所有执行路径都有返回值
}
错误 3:在函数中提前 return 导致资源泄漏
在更复杂的程序中,如果在 return 之前分配了内存(malloc)或打开了文件(fopen),但没有释放它们,就会导致资源泄漏。
#include <stdlib.h> // for malloc
void process_data() {
int *data = (int*)malloc(100 * sizeof(int)); // 分配内存
if (data == NULL) {
return; // 错误!直接返回,没有释放 data 指向的内存
}
// ... 处理数据 ...
// 如果这里有一个错误,也可能会提前返回
if (some_error_condition) {
return; // 错误!内存泄漏!
}
free(data); // 正确释放内存
}
正确写法(使用 goto 或确保所有路径都释放):
void process_data() {
int *data = (int*)malloc(100 * sizeof(int));
if (data == NULL) {
return;
}
// ... 处理数据 ...
if (some_error_condition) {
goto cleanup; // 跳转到清理代码
}
// ... 正常处理 ...
cleanup:
free(data); // 确保在任何情况下都会释放内存
}
| 用法场景 | 语法 | 说明 |
|---|---|---|
| 返回一个值 | return 表达式; |
用于有返回值的函数(非 void),将表达式的值传给调用者,并终止函数。 |
| 仅终止函数 | return; |
用于 void 函数,或任何函数中需要提前退出的地方,不返回任何值。 |
main 函数 |
return 0; 或 return 非0; |
return 0 表示程序成功结束;return 非0 表示程序异常结束。 |
return 的两个核心作用:“带回值” 和 “结束跑路”,就能很好地掌握它的用法。
