Appearance
[English version](/posts/c教程/en-US/02-Language Basics/018-Return Values and Function Signatures)
函数不仅执行任务,而且经常将结果传达给调用者。他们通过返回值来做到这一点。每个 C 函数都有一个签名,一个定义其返回类型、名称和参数的声明。熟悉签名和返回值可以帮助您编写干净、可预测和模块化的程序。
函数签名解释
函数签名如下所示:
return_type function_name(parameter_list);它告诉编译器:
- 函数返回什么样的值(
int,double,void, ETC。) - 函数叫什么
- 它需要什么参数及其类型
例子:
int max(int a, int b);这说:“max是一个接受两个整数并返回一个整数的函数。”
返回值
您使用return关键字从函数发送回值。
int add(int x, int y) {
return x + y;
}返回值的类型必须与函数声明的返回类型匹配。
如果函数不需要返回任何内容,请将其声明为void:
void greet(void) {
printf("Hello!\n");
}一个void函数仍然可以执行操作,只是不产生结果。
多个返回点
如果满足某些条件,您可以提前返回。
int divide(int a, int b) {
if (b == 0) {
printf("Error: division by zero!\n");
return 0;
}
return a / b;
}这对于错误处理或输入验证很常见。
返回不同的数据类型
您可以返回任何类型,而不仅仅是整数。
double average(double a, double b) {
return (a + b) / 2.0;
}
char first_letter(const char *word) {
return word[0];
}
_Bool is_even(int n) {
return n % 2 == 0;
}对于更复杂的数据,您稍后将学习如何返回指针或结构。
小代码
这是一个完整的示例,显示了几种返回类型和签名:
#include <stdio.h>
#include <stdbool.h>
// function declarations
int add(int x, int y);
double divide(double a, double b);
bool is_even(int n);
void greet(const char *name);
int main(void) {
greet("C Programmer");
int sum = add(7, 3);
double quotient = divide(10.0, 4.0);
bool check = is_even(sum);
printf("Sum: %d\n", sum);
printf("Quotient: %.2f\n", quotient);
printf("Is sum even? %s\n", check ? "Yes" : "No");
return 0;
}
// function definitions
int add(int x, int y) {
return x + y;
}
double divide(double a, double b) {
if (b == 0.0) {
printf("Cannot divide by zero.\n");
return 0.0;
}
return a / b;
}
bool is_even(int n) {
return n % 2 == 0;
}
void greet(const char *name) {
printf("Hello, %s!\n", name);
}编译并运行:
gcc return_demo.c -o return_demo
./return_demo输出:
Hello, C Programmer!
Sum: 10
Quotient: 2.50
Is sum even? Yes为什么它很重要
返回值是函数通信的方式。通过设计清晰且有意义的签名:
- 您使您的代码可预测,每个函数都有明确的目的和输出。
- 编译器可以检查正确性,不匹配的类型会引发警告。
- 您可以组合函数,一个函数的返回成为另一个函数的输入。
在大型系统中,一致的签名和有意义的返回类型构成了良好 API 设计的支柱。
自己尝试一下
- 编写一个函数
max(a, b)返回两个整数中较大的一个。 - 编写函数
to_upper(char c)返回字符的大写版本。 3.修改一个divide()返回的函数-1如果发生被零除。 - 创建一个
sum_to_n(int n)返回从 1 到所有数字的总和n. - 尝试使用
void打印另一个函数调用结果的函数。
返回值赋予您的函数目的,它们将简单的操作转化为可重用的构建块,使您的程序具有表现力、模块化和活力。
