1. 函数的概念
2. 库函数
double sqrt(double x)
第一个double表示该函数的返回值的类型,sqrt是该函数的函数名,第二个double表示该函数参数的类型,x是该函数的一个参数。
sqrt函数的使用需要引用头文件math.h,实现代码如下:
#include<stdio.h>
#include<math.h>
int main()
{
double a=16.0;
double b=sqrt(a);
printf("%lf",b);
return 0;
}
代码结果为b的值,也就是4.000000。
3. 自定义函数
type name(形式参数)
{
}
type是该自定义函数的返回值类型,有时候函数可能没有返回值,那此时返回值类型为void。
name为该自定义函数的名字,可以随便起,但最好与该函数符合,容易理解。
函数的参数也要有类型,当参数的类型不确定时可以使其类型为void类型,此时传入函数的数据类型就是该函数参数的类型。而当函数没有参数时,可以在()内写void,表示该函数的参数为空。
在{}内的代码就是函数体,函数体就是函数的执行过程。
介绍完了自定义函数,我们可以试着来写一个加法函数。
#include<stdio.h>
int add(int x,int y)
{
return x+y;
}
int main()
{
int a=3;
int b=5;
int sum=add(a,b);
printf("%d",sum);
return 0;
}
4. 形参和实参
![](https://i-blog.csdnimg.cn/blog_migrate/b78e9c6b05bd3bb7464274e23a9237c7.png)
5. return语句
在函数中,我们经常可以看见return的语句,对于return语句来说,有许多需要注意的:
1. return后边可以是⼀个数值,也可以是⼀个表达式,如果是表达式则先执⾏表达式,再返回表达式的结果。
2. return后边也可以什么都没有,直接写 return; 这种写法适合函数返回类型是void的情况。
3. return返回的值和函数返回类型不⼀致,系统会⾃动将返回的值隐式转换为函数的返回类型。
4. return语句执⾏后,函数就彻底返回,后边的代码不再执⾏。
5.如果函数中存在if等分⽀的语句,则要保证每种情况下都有return返回,否则会出现编译错误。
6. 数组作为函数参数
在我们使用函数时,避免不了把数组作为函数的参数来对数组进行一系列操作,而我们要对整个数组进行操作,就要知道数组的元素个数,所以数组传参的同时常常还要把数组的元素个数作为一个参数。
比如说我们想让一个数组通过函数进行初始化并打印,在写代码之前,我们要了解一下数组传参的知识:
#include<stdio.h>
void test(int str[], int n)
{
int i = 0;
for (i = 0; i < n; i++)
{
str[i] = i;
}
for (i = 0; i < n; i++)
{
printf("%d ", str[i]);
}
}
int main()
{
int a[10] = { 0 };
int sz = sizeof(a) / sizeof(a[0]);
test(a, sz);
return 0;
}
此代码执行后数组的每个元素获得与其下标相同的值,在此之后,我们可以使用函数对数组进行操作了。
7. 函数的嵌套调用
在函数的使用过程中,总会遇到某些问题需要许多函数同时进行,函数的嵌套调用就是函数间的相互调用。
比如我们想求某年某月有多少天,首先要判断这一年是不是闰年,其次我们还要判断这一个月是不是2月。
#include<stdio.h>
int leap_year(int a)
{
if (((a % 4 == 0) && (a % 100 != 0)) || (a % 400 == 0))
{
return 1;
}
return 0;
}
int get_days(int a, int b)
{
int a[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int days = a[b];
if (leap_year(a) && b == 2)
{
days++;
}
return days;
}
int main()
{
int year = 0;
int month = 0;
scanf("%d %d", &year, &month);
int day=get_days(year, month);
printf("第%d年第%d月有%d天\n", year, month, day);
return 0;
}
leap_year函数用来判断是不是闰年,get_days用来计算这一年这一个月有多少天。
对于不同的函数来说,可以进行嵌套调用,但是不能嵌套定义。
8. 函数的链式访问
#include<stdio.h>
#include<string.h>
int main()
{
char c[] = { "abcdef" };
int len = strlen(c);
printf("%d\n", len);
printf("%d\n", strlen(c));
return 0;
}
第一个printf打印的是len的值,而第二个printf则是以strlen函数的返回值作为参数,此时就是函数的链式访问。
那么下面代码的打印结果应该是什么呢?
#include<stdio.h>
int main()
{
int a = 43;
printf("%d", printf("%d", printf("%d", a)));
return 0;
}
对于printf函数来说,它的返回值是打印的字符个数,最内层的printf打印43,是2个字符,返回值为2,所以第二次打印2,第二个printf函数的返回值就为1,所以第三次打印1,最终结果为4321。
9. 函数的声明和定义
最后,我们再来介绍一下函数的声明与定义。对于一个函数来说,它的声明一定要在函数调用之前,因为在函数调用前要让系统知道这一串代码是函数才能不会报错。
通常我们将函数的声明写在程序前面,函数的声明形式如下:
type name(形式参数)
对于函数的定义,定义既可以在主函数之前,又可在主函数之后。那么,为什么定义在主函数之前时没有了函数声明呢?
事实上,函数的定义是一种特殊的声明。
本章C语言函数的介绍,完。