C语言函数
1.函数的概念
C语言中的函数就是一个完成某项特定任务的一小段代码(也叫子程序)包括库函数和自定义函数。
2.库函数
2.1标准库和头文件
C语言标准中规定了C语言的各种语法规则,C语言并不提供库函数,C语言的国际标准规定了一些常用的函数的标准,被称为标准库,不同编译器厂商根据ANSI提供的标准给出了一系列函数的实现。这些函数被称为库函数。
各种编译器的标准库中提供了一系列的库函数,这些库函数根据功能的划分,都在不同的头文件中进行了声明。库函数的使用必须包含其所对应的头文件。例如:在代码中使用printf和scanf时必须写#include<stdio.h>。
3.自定义函数
3.1语法形式
ret_type fun_nume(形式参数)
{
}
- ret_type 是函数返回类型
可以是int,char,long等当函数只为了实现某一个功能(类似于打印)且不需要返回任何值时应该写void。 - fun_name 是函数名
- 括号中是形式参数
有参数时应该交代清楚参数的类型与名字,无参数时可以写void也可以不写 - {}括起来的是函数体
函数实现的过程
3.2函数的举例
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int Add(int x, int y)
{
int z = 0;
z = x + y;//也可以是return x+y;
return z;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
int c = Add(a, b);
printf("%d", c);
return 0;
}
自定义函数实现两数相加
4.形参和实参
4.1形参
在定义函数时,在函数名后括号中的变量称为形式参数,简称形参。实际上当只定义了函数而没有调用时自定义函数中的形参只是形式上存在不会向内存申请空间。形式参数只有在函数被调用过程中为了存放实参传递过来的值,才会向内存申请空间,这个过程叫形参的实例化
4.2实
调用函数时传递给函数的参数,称为实际参数,简称实参
5.return语句
使用return语句的注意事项
- return 后面可以是一个数值也可以是一个表达式,如果是一个表达式则先执行表达式,再返回表达式的结果。
- return 后面可以什么也没有,直接写return;这种写法适合返回类型是void的情况。
- return 返回的类型和函数返回类型不一致时,系统会自动将返回的值隐式转化为函数的返回类型。
- return 语句执行后函数就彻底返回,后续代码不会执行。
- 如果函数存在if 等分支语句则要保证每一条分支下都要有return语句,否则会出现编译错误。
6.数组做函数参数
- 代码举例
//数组做函数参数
void set_arr(int arr[], int sz)//将数组中的全部元素都改为-1
{
int i = 0;
for (i = 0; i < sz; i++)
{
arr[i] = -1;
}
}
void printf_arr(int arr[], int sz)//打印全部元素
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d", arr[i]);
}
printf("\n");
}
int main()
{
int arr[10] = { 0 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
scanf("%d", &arr[i]);//在数组中输入元素
}
set_arr(arr,sz);//函数调用
printf_arr(arr, sz);
return 0;
}
7.嵌套调用和链式访问
7.1函数的嵌套调用
//函数的嵌套调用
is_leap_year()//判断是否为闰年
get_days_of_month()//一个月有多少天
int is_leap_year(int year);
int get_days_of_month(int year, int month);
int main()
{
int year = 0;
int month = 0;
scanf("%d%d", &year, &month);
int days =get_days_of_month(year,month);
printf("%d\n", days);
return 0;
}
int is_leap_year(int year)
{
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
return 1;
else
return 0;
}
int get_days_of_month(int year, int month)
{
int arr1[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int days = arr1[month];
if (is_leap_year(year) && month ==2)//嵌套调用
days += 1;
return days;
}
在代码中完成了计算某年某月有多少天。反应了函数之间的嵌套调用
- main函数中调用了scanf,printf,get_days_of_month。
- get_days_of_month中调用了is_leap_year
函数之间可以嵌套调用但不能嵌套定义
7.2函数的链式访问
所谓链式访问就是一个函数的返回值作为另一个函数的参数
printf("%d\n", strlen("qwerty"));
此时strlen函数的返回值做了printf函数的参数为链式访问
8.函数的声明和定义
当函数调用在函数定义之前时应该在开头加上函数声明,例:
int Add(int x, int y);//函数声明
int main()
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
int c = Add(a, b);//函数调用
printf("%d", c);
return 0;
}
int Add(int x, int y)//函数定义
{
return x + y;
}