return 是 C 语言中的一个关键字,它的核心作用有两个:

- 从函数中返回一个值。
- 立即终止当前函数的执行,并将程序控制权交还给调用该函数的地方。
下面我们分情况来详细说明。
return 的基本语法
return 语句的基本语法有以下两种形式:
返回一个值
return expression;
expression是一个表达式,它的计算结果将被返回给函数的调用者。- 这种形式用于函数的返回值类型不是
void的函数。
不返回值(仅用于 void 函数)
return;
- 这种形式仅用于返回类型为
void的函数。 - 它的作用是立即结束函数的执行,回到调用点,虽然
return;在void函数的末尾可以省略,但在某些逻辑分支中提前退出时非常有用。
return 的主要用法场景
从非 void 函数返回一个值
当一个函数被声明为返回某种数据类型(如 int, float, char, double 或指针等)时,它必须使用 return expression; 来返回一个值,该值的类型必须与函数声明中的返回类型兼容(或可以自动转换)。
示例:计算两个整数的和

#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(5, 3) 的返回值 8 被赋值给 result
printf("5 + 3 = %d\n", result); // 输出: 5 + 3 = 8
return 0; // main 函数返回 0,表示程序正常结束
}
关键点:
return语句执行后,add函数立即结束。return sum;中的sum的值被传递出来,成为add(5, 3)这个表达式的值。
从 void 函数返回
void 函数表示“不返回任何值”,它不能返回一个值,但可以使用 return; 来提前结束函数执行。
示例:打印一个消息
#include <stdio.h>
// 函数声明,返回类型为 void,表示不返回值
void print_message() {
printf("Hello, World!\n");
// 函数执行到这里会自然结束,return; 可以省略
}
// 另一个 void 函数,使用 return 提前退出
void check_number(int num) {
if (num < 0) {
printf("Number is negative.\n");
return; // 当 num < 0 时,函数立即终止,后面的代码不会执行
}
printf("Number is non-negative.\n");
}
int main() {
print_message();
check_number(-10);
check_number(20);
return 0;
}
输出:

Hello, World!
Number is negative.
Number is non-negative.
关键点:
- 在
check_number函数中,num < 0,return;会立即跳出函数,printf("Number is non-negative.\n");这一行代码将不会被执行。 - 这对于避免不必要的计算或处理错误条件非常有用。
return 的高级用法与注意事项
提前返回
这是 return 最重要的编程技巧之一,即根据条件在函数中间使用 return 来提前退出,这可以避免使用深层嵌套的 if-else 语句,使代码更清晰、更易读。
不推荐的做法(深层嵌套):
int process_data(int data) {
if (data > 0) {
// ... 一些处理 ...
if (data < 100) {
// ... 另一些处理 ...
if (data % 2 == 0) {
// ... 最终处理 ...
return 1; // 成功
}
}
}
return 0; // 失败
}
推荐的做法(提前返回):
int process_data(int data) {
// 先检查失败条件,失败则立即返回
if (data <= 0) {
return 0; // 无效数据
}
if (data >= 100) {
return 0; // 数据过大
}
if (data % 2 != 0) {
return 0; // 数据不符合奇偶要求
}
// 如果所有检查都通过,执行核心逻辑
// ... 最终处理 ...
return 1; // 成功
}
第二种写法的逻辑线是“从上到下”,而不是“从外到内”,可读性大大提高。
返回指针
函数可以返回一个指向局部变量的指针,但这是一个非常危险的操作,被称为“悬垂指针”(Dangling Pointer)。
错误示例:
#include <stdio.h>
int* get_bad_pointer() {
int local_var = 100;
// 返回一个局部变量的地址
return &local_var;
}
int main() {
int* p = get_bad_pointer();
// get_bad_pointer 函数栈帧已被销毁,local_var 的内存空间不再有效
printf("%d\n", *p); // 行为是未定义的!可能会输出 100,也可能输出垃圾值,甚至导致程序崩溃
return 0;
}
为什么是错误的?
local_var是get_bad_pointer函数内的局部变量,存储在栈上。- 当
get_bad_pointer函数执行完毕返回时,它的栈帧被销毁,local_var所占用的内存被释放。 - 指针
p仍然保存着那个已经无效的地址,试图通过p去访问内存就是非法的。
正确做法: 返回指针时,确保指针指向的内存是有效的,通常有两种情况:
- 指向静态变量或全局变量(它们的生命周期是整个程序)。
- 指向通过
malloc等动态内存分配函数在堆上分配的内存(调用者负责释放)。
// 正确示例1:返回静态变量的指针
int* get_good_pointer() {
static int static_var = 100; // static 变量存储在静态区,生命周期是整个程序
return &static_var;
}
// 正确示例2:返回动态分配的内存指针
int* create_array(int size) {
int* arr = (int*)malloc(size * sizeof(int));
if (arr != NULL) {
for (int i = 0; i < size; i++) {
arr[i] = i;
}
}
return arr; // 调用者需要记得 free(arr)
}
return 与 void 表达式
在 C99 标准及以后,return 语句中的 expression 可以是一个 void 类型的表达式,例如一个函数调用。
#include <stdio.h>
void log_message(const char* msg) {
printf("[LOG]: %s\n", msg);
}
void do_something() {
// do_something() 的返回类型是 void
// log_message 的返回类型也是 void
// 所以可以这样写
return log_message("Operation completed successfully.");
}
int main() {
do_something();
return 0;
}
这行代码等同于:
log_message("Operation completed successfully.");
return;
这种写法在某些场景下可以简化代码,但有时也会降低可读性,使用时需权衡。
return 在 main 函数中的作用
main 函数是程序的入口,它的返回值通常用于向操作系统表示程序的执行状态。
return 0;:表示程序成功执行完毕,没有发生错误,这是最常见的情况。return 非0值;:通常表示程序执行过程中遇到了错误或异常,不同的非零值可以代表不同的错误类型,方便调用脚本来判断。
在很多现代操作系统中,main 函数也可以没有 return 语句,在 main 函数的末尾,编译器会自动插入一个 return 0;,但显式地写出 return 0; 是更好的编程习惯。
| 用法场景 | 语法 | 作用 | 示例 |
|---|---|---|---|
| 返回值 | return expression; |
计算表达式,将其值返回给调用者,并终止函数。 | return a + b; |
| 无返回值 | return; |
仅用于 void 函数,立即终止函数执行。 |
if (error) return; |
| 提前返回 | return expression; 或 return; |
在函数中间根据条件退出,避免深层嵌套,提高代码清晰度。 | if (!ptr) return NULL; |
| 返回指针 | return &variable; |
返回一个内存地址。必须确保该地址在函数返回后仍然有效! | return &static_var; 或 return malloc(...); |
| 程序状态 | return 0; (在 main 中) |
向操作系统报告程序成功结束。 | int main() { ... return 0; } |
掌握 return 语句是学习 C 语言函数的基础,正确、灵活地使用 return,特别是“提前返回”的模式,能帮助你写出更健壮、更易读的代码,要时刻警惕“悬垂指针”这类由错误使用 return 导致的严重问题。
