学懂C语言(十四):认识C语言中的函数
目录
C语言中函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。
一、函数的基本概念
- 函数声明:告诉编译器函数的名称、返回类型和参数。
- 函数定义:包含函数的实际代码。
- 函数调用:在程序中使用函数来执行其任务。
二、定义函数
C 语言中的函数定义的一般形式如下:
return_type function_name( parameter list ) { body of the function }
在 C 语言中,函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分:
- 返回类型:一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void。
- 函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。
- 参数:参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
- 函数主体:函数主体包含一组定义函数执行任务的语句。
三、函数示例
示例1:一个简单的函数
假设我们需要一个函数来计算两个整数的和:
#include <stdio.h>
// 函数声明
int add(int a, int b);
// 主函数
int main() {
int num1 = 5, num2 = 3;
int result = add(num1, num2); // 函数调用
printf("The sum is: %d\n", result);
return 0;
}
// 函数定义
int add(int a, int b) {
return a + b;
}
在这个示例中:
int add(int a, int b);
是函数声明,告诉编译器有一个名为add
的函数,它接受两个int
类型的参数并返回一个int
类型的值。int add(int a, int b) { return a + b; }
是函数定义,包含函数的实际代码。int result = add(num1, num2);
是函数调用,程序执行到这里时会跳转到add
函数,并将num1
和num2
的值传递给a
和b
。
示例2:带返回值的函数
假设我们需要一个函数来判断一个数是否为偶数:
#include <stdio.h>
// 函数声明
int isEven(int num);
// 主函数
int main() {
int number = 6;
if (isEven(number)) {
printf("%d is an even number.\n", number);
} else {
printf("%d is an odd number.\n", number);
}
return 0;
}
// 函数定义
int isEven(int num) {
return num % 2 == 0;
}
在这个示例中:
int isEven(int num);
是函数声明。int isEven(int num) { return num % 2 == 0; }
是函数定义,返回一个布尔值(0 或 1),表示num
是否为偶数。if (isEven(number))
是函数调用,根据返回值判断number
是否为偶数。
示例3:不带返回值的函数
假设我们需要一个函数来打印一个字符串:
#include <stdio.h>
// 函数声明
void printString(const char *str);
// 主函数
int main() {
printString("Hello, World!");
return 0;
}
// 函数定义
void printString(const char *str) {
printf("%s\n", str);
}
在这个示例中:
void printString(const char *str);
是函数声明,表示printString
函数不返回任何值,并接受一个字符串参数。void printString(const char *str) { printf("%s\n", str); }
是函数定义,打印传入的字符串。printString("Hello, World!");
是函数调用,打印字符串 "Hello, World!"。
四、函数分类
1. 按照函数的功能分类
-
库函数(Library Functions):
- 由C标准库提供的函数。
- 例如:
printf
、scanf
、strlen
、strcpy
、malloc
等。
-
用户自定义函数(User-Defined Functions):
- 由程序员自行编写的函数。
- 例如:
int add(int a, int b)
、void printMessage()
等。
2. 按照返回值类型分类
-
无返回值函数(Void Functions):
- 不返回任何值,用
void
声明。 - 例如:
void printHello()
。
- 不返回任何值,用
-
有返回值函数(Value-Returning Functions):
- 返回一个特定类型的值。
- 例如:
int max(int a, int b)
、float calculateAverage(float a, float b)
等。
3. 按照参数个数分类
-
无参数函数(Parameterless Functions):
- 不接受任何参数。
- 例如:
void displayMessage()
。
-
有参数函数(Parameterized Functions):
- 接受一个或多个参数。
- 例如:
int sum(int a, int b)
、float area(float radius)
。
4. 按照函数的作用范围分类
-
全局函数(Global Functions):
- 在所有文件中都可见,可以在多个文件中调用。
- 默认情况下,所有函数都是全局函数,除非使用
static
关键字。
-
局部函数(Local Functions):
- 仅在定义它们的文件中可见。
- 使用
static
关键字定义,例如:static void helperFunction()
。
5. 按照调用方式分类
-
递归函数(Recursive Functions):
- 函数调用自身。
- 例如:计算阶乘的函数:
int factorial(int n)
。
-
非递归函数(Non-Recursive Functions):
- 函数不调用自身。
- 例如:
int add(int a, int b)
。
6. 按照使用的内存分配分类
-
普通函数(Regular Functions):
- 在编译时分配内存。
- 例如:常规的
main
函数和大部分用户自定义函数。
-
内联函数(Inline Functions):
- 建议编译器在调用时将函数代码直接嵌入调用处,以减少函数调用的开销。
- 使用
inline
关键字声明,例如:inline int add(int a, int b)
。
示例代码
#include <stdio.h>
#include <string.h>
// 库函数示例
void libraryFunctionExample() {
char str[50];
strcpy(str, "Hello, World!"); // 使用库函数strcpy
printf("%s\n", str); // 使用库函数printf
}
// 用户自定义函数示例
int add(int a, int b) {
return a + b;
}
// 无返回值函数示例
void printHello() {
printf("Hello\n");
}
// 有返回值函数示例
int max(int a, int b) {
return (a > b) ? a : b;
}
// 无参数函数示例
void displayMessage() {
printf("This is a message.\n");
}
// 有参数函数示例
void printNumber(int num) {
printf("The number is: %d\n", num);
}
// 递归函数示例
int factorial(int n) {
if (n <= 1) return 1;
else return n * factorial(n - 1);
}
int main() {
// 调用库函数示例
libraryFunctionExample();
// 调用用户自定义函数示例
int result = add(3, 4);
printf("The sum is: %d\n", result);
// 调用无返回值函数示例
printHello();
// 调用有返回值函数示例
int maximum = max(10, 20);
printf("The maximum is: %d\n", maximum);
// 调用无参数函数示例
displayMessage();
// 调用有参数函数示例
printNumber(42);
// 调用递归函数示例
int fact = factorial(5);
printf("The factorial of 5 is: %d\n", fact);
return 0;
}
原文地址:https://blog.csdn.net/martian665/article/details/140616825
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!