(一)函数的概念
在我们平时学习数学时,会经常用到函数,一次函数,二次函数,反函数……而在c语言中也引入了函数的概念。
(二)库函数
在c语言中的函数一般分为库函数和自定义函数。库函数在我们之前的学习中就已经学习了一部分。比如printf,scanf都是常见的库函数,而库函数在c语言中是现成的,只要学会了就可以直接用,比如printf输出数据,scanf输入数据,而它们的使用必须在相应的头文件里进行,输入输出必须报含头文件#include <stdio.h>,sqrt()函数,也就是计算平方根,它则必须报含头文件#include<math.h>
(三)自定义函数
除了库函数外,c语言中还有自定义函数,它的形式如下
ret_type fun_name()
{
}
//ret_type是函数返回类型
//fun_name是函数名
//()里的放形式参数
//{}里放的是函数体
它不像库函数一样,我们学会了就可以直接使用,它是需要我们给它规定它要完成的任务。
注意⚠️:我们在使用函数时,要将函数的参数部分交代清楚,1:参数个数。2:每个参数的类型是什么。3:形参的名字。 比如我们想要完成一个加法运算,那么我们就可以写一个加法函数Add(),如下代码
#include <stdio.h>
int Add(int x,int y)//x,y是形式参数
{
int z=0;
z=x+y;
return z;
}
int main()
{
int a=0;
int b=0;
scanf("%d %d",&a,&b);
int r=Add(a,b); //a,b是实际参数
printf("%d\n",r);
return 0;
}
在上述代码中,加法函数括号里的是形式参数,而在主函数里的加法函数括号中的是实际参数。实际参数和形式参数虽然有联系,但是它们是各自独立的,在上述代码中,当我们调用了加法函数Add()时,里面的形式参数才会向内存申请空间,如果没有调用加法函数,那么Add函数的参数x,y就不会向内存申请空间,就不是真实存在
(四)return语句
在函数的设计中,会经常出现return语句。这里是使用return语句的几个注意事项⚠️
1:return后面可以是数值,像上方Add函数,return后面也可以直接是表达式,比如下方Add函数
#include <stdio.h>
int Add(int x,int y)//x,y是形式参数
{
return x+y;
}
int main()
{
int a=0;
int b=0;
scanf("%d %d",&a,&b);
int r=Add(a,b); //a,b是实际参数
printf("%d\n",r);
return 0;
}
2:return后面也可以什么都没有,适合函数返回值类型是void的情况,比如下方代码
#include <stdio.h>
void print_num(int x,int y)//无需返回值,类型是void,直接打印x,y
{
x=2;
y=5;
printf("%d %d",x,y);
}
int main()
{
int a=0;
int b=0;
print_num(a,b);
return 0;
{
3:return语句执行后,函数就会彻底返回,后面的代码不执行,比如下方代码
#include <stdio.h>
void test_return()
{
printf("函数开始执行\n");
return;
printf("return后的代码不会执行\n");//这一行代码不会执行
}
int main()
{
test_return();
return 0;
}
(五)数组作函数参数
在使用函数时,我们除了用普通的数据作为参数外,在日后的学习种肯定还会使用到数组作为函数参数。在使用数组作为函数参数时,我们需要将数组,以及数组的个数作为参数传递给函数,比如下方函数
#include <stdio.h>
void print_arr(int arr[],int sz)
{
int i=0;
for(i=0;i<sz;i++)
{
printf("%d\n",arr[i]);//打印出数组里的每个元素
}
}
int main()
{
int arr[]={0,1,2,3,4};
int sz=siof(arr)/sizeof(arr[0]));//计算数组元素的个数
print_arr(arr,sz);//实际参数传入数组arr和数组元素个数
return 0;
}
(六)函数之间的相互调用
我们不仅能在主函数里调用我们设置的自定义函数,我也可以在我们设置的函数里再次调用我们设置的新函数,比如我们想写一个代码,要求出某年某月有多少天,首先我们可以设置一个函数,在里面存入每个月有多少天,但是因为有闰年的存在,我们可以利用前面的知识在再设置一个判断是否为闰年的函数,再在第一个函数里调用判断是否为闰年的函数,如果是,那么就要在2月份的天数上多加一天。具体代码实现如下
#include <stdio.h>
int is_leap_year(int year)
{
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
return 1;
}
else
return 0;
}
month_of_days(int year,int month)
{
int days[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int day = days[month];
if (is_leap_year(year) && month == 2)//调用了判断是否为闰年的函数
day += 1;
return day;
}
int main()
{
int year = 0;
int month = 0;
scanf("%d %d", &year, &month);
int d=month_of_days(year,month);
printf("%d", d);
return 0;
}
(七)printf函数的返回值
这里我们补充一个printf返回值,printf函数返回的是打印再屏幕上字符的个数,如下代码
printf("%d",printf("%d",printf("%d",33));
//33是两个字符,所以返回2
//2是一个字符,所以返回1
//最终结果是3321
最终在屏幕上打印的是什么呢 没错,是3321
(八)函数的声明和定义
在我们上述代码的使用中,函数都是直接放在主函数前面的,但如果我们将函数放在主函数后面的话,如下代码
#include <stdio.h>
int main()
{
int a=0;
int b=0;
scanf("%d %d",&a,&b);
int r=Add(a,b); //在前面没有发现Add函数
printf("%d\n",r);
return 0;
}
int Add(int x,int y)
{
int z=0;
z=x+y;
return z;
}
会出现错误,因为在调用函数时,程序从前往后运行,当我们要使用这个函数时,程序发现前面并没有出现这个函数,所以会出现错误,想要纠正这个错误也很简单,不必将整个函数放在前面,只需要在主函数前声明一下要用的这个函数就可以,可以修正成如下形式
#include <stdio.h>
int Add(int x,int y);
int main()
{
int a=0;
int b=0;
scanf("%d %d",&a,&b);
int r=Add(a,b); //在前面没有发现Add函数
printf("%d\n",r);
return 0;
}
int Add(int x,int y)
{
int z=0;
z=x+y;
return z;
}

527

被折叠的 条评论
为什么被折叠?



