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

- 从函数中退出:立即终止当前函数的执行,并将程序控制权交还给调用该函数的地方。
- 返回一个值:将一个值(或一个变量/表达式的结果)从被调用函数传递回调用它的函数。
return 的基本语法
return 语句的基本语法有两种形式:
不带返回值的 return
return;
这种形式只执行第一个功能:立即退出函数,它通常用于以下两种情况:
- 函数返回类型是
void(无返回值)。 - 在函数的某个逻辑分支中,需要提前退出,但不需要返回一个具体的值。
示例 1:用于 void 函数
#include <stdio.h>
void print_message(int times) {
for (int i = 0; i < times; i++) {
printf("Hello, World!\n");
// times 为 0 或负数,这个循环不会执行,函数会自然结束
// times 是 5,循环结束后,函数也会自然结束
}
// 函数执行到这里,就结束了,相当于隐式地执行了 "return;"
}
int main() {
print_message(3);
print_message(0); // 调用后立即返回
return 0;
}
示例 2:在非 void 函数中提前退出(不推荐,但可行)

#include <stdio.h>
int find_max(int a, int b) {
if (a == b) {
printf("The numbers are equal.\n");
return; // 语法上允许,但逻辑上危险!
}
return (a > b) ? a : b;
}
int main() {
int result = find_max(10, 10);
// 这里的 result 是什么?它的值是未定义的!
// 因为 find_max 函数没有返回一个有效的整数值。
printf("Result: %d\n", result); // 输出可能是垃圾值
return 0;
}
注意:虽然在 C 语言中,如果函数有返回值(如
int),但你在某个分支中只写了return;而不返回值,这在语法上可能不会在所有编译器上都报错,但这是非常危险且不推荐的做法,它会导致函数返回一个不确定的、无意义的值,可能引发程序错误。
带返回值的 return
return expression;
这种形式同时执行两个功能:退出函数,并将 expression 的计算结果返回给调用者。
关键规则:
- 函数声明中指定的返回类型,必须与
return语句中expression的类型兼容,如果类型不匹配,编译器会尝试进行隐式类型转换,如果转换不合法,则会编译报错。
示例 3:返回一个值

#include <stdio.h>
// 函数声明,返回一个 int 类型的值
int add(int x, int y) {
int sum = x + y;
return sum; // 返回 sum 变量的值
}
// 也可以直接返回表达式的结果
int multiply(int x, int y) {
return x * y;
}
int main() {
int a = 5;
int b = 3;
int result1 = add(a, b);
printf("Sum: %d\n", result1); // 输出: Sum: 8
int result2 = multiply(a, b);
printf("Product: %d\n", result2); // 输出: Product: 15
return 0;
}
return() 的写法
你问题中提到了 return(),带括号的写法。
return (value); 和 return value; 在功能上是完全等价的,括号在 C 语言中是一个普通的分组运算符,在这里只是将 value 括起来,使其成为一个表达式。
哪种风格更好?
这主要取决于代码风格和个人/团队的规范。
-
return value;:这是更简洁、更常见的写法,尤其是在返回简单变量或表达式时,许多 C 程序员和风格指南(如 Google C++ Style Guide,其 C 部分也常被借鉴)推荐这种方式。return a + b;
-
return (value);:这种写法在某些情况下可以提高可读性,特别是当返回的是一个复杂的表达式时,括号可以帮助清晰地界定返回值的范围。return (a * b + c / d); // 括号让运算优先级更清晰
两种写法都可以,但为了保持一致性,建议在整个项目中统一使用一种风格,在绝大多数情况下,直接使用 return value; 更为普遍。
return 的重要细节和最佳实践
a. return 的数量
一个函数可以有多个 return 语句,这通常用于处理不同的逻辑分支。
#include <stdio.h>
// 返回三个数中的最大值
int max_of_three(int a, int b, int c) {
if (a >= b && a >= c) {
return a;
} else if (b >= a && b >= c) {
return b;
} else {
return c;
}
}
注意:虽然多个
return语句很常见,但在复杂的函数中,过多的return语句可能会影响代码的可读性(所谓的“箭头代码”),对于非常长的函数,可以考虑在末尾只使用一个return语句,通过一个变量来存储结果。
b. return 与函数返回类型
-
必须匹配:
return的值类型必须与函数声明的返回类型兼容。double get_pi() { return 3.14; // 正确,double 类型返回 double 值 } int get_count() { // return 10.5; // 警告:将 double 转换为 int,会丢失精度(变为 10) return 10; // 正确 } -
void函数:如果函数被声明为void,理论上不应该返回任何值,但在 C 语言中,return;是允许的,用于提前退出,绝对不能写return some_value;,否则会编译报错。
c. return 指针
return 也可以返回一个指针(即内存地址),这通常用于返回动态分配的内存、数组名或静态变量的地址。
示例 4:返回一个指针
#include <stdio.h>
#include <stdlib.h> // for malloc
// 返回一个指向动态分配整数的指针
int* create_dynamic_int(int value) {
int* ptr = (int*)malloc(sizeof(int));
if (ptr != NULL) {
*ptr = value;
}
return ptr; // 返回指针
}
int main() {
int* my_number = create_dynamic_int(100);
if (my_number != NULL) {
printf("Dynamic value: %d\n", *my_number);
free(my_number); // 记得释放内存!
}
return 0;
}
重要警告:绝对不要返回局部变量的地址! 局部变量存储在栈上,当函数执行完毕返回时,栈空间会被释放,该变量的地址就变成了“野指针”(dangling pointer),访问它是未定义行为,可能导致程序崩溃。
int* get_bad_pointer() {
int local_var = 42;
return &local_var; // 错误!local_var 在函数返回后会被销毁
}
| 特性 | 描述 | 示例 |
|---|---|---|
| 核心功能 | 终止函数执行 返回一个值 |
return; 或 return 10; |
| 语法 | return; 或 return expression; |
return (a + b); |
return() vs return |
功能相同,括号是分组运算符,风格选择问题 | return x; (更推荐) |
| 与返回类型关系 | 必须兼容,否则编译错误或隐式转换 | int func() { return 3.14; } // 警告 |
void 函数 |
只能用 return; 提前退出,不能返回值 |
void func() { return; } |
| 返回指针 | 可以返回指针,但不能返回局部变量的地址 | int* func() { return malloc(sizeof(int)); } |
| 最佳实践 | 保持代码清晰,确保释放动态内存,避免过多 return 语句影响可读性 |
- |
掌握 return 语句是学习 C 函数编程的基础,理解它如何控制程序流程和数据传递,对于编写正确、健壮的 C 程序至关重要。
