(一)函数的概念
在我们平时学习数学时,会经常用到函数,一次函数,二次函数,反函数……而在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; }