一:函数的概念
二:函数的分类
#标准函数与自定义函数
##有返回值函数与无返回值函数
###有参函数与无参函数
三:函数的定义与调用
#函数原型(函数的声明)
四:从函数中返回
一:函数的概念
在我们正式了解函数之前,先看看在维基百科中对函数的定义。在维基百科中,函数的定义叫子程序。结构化程序设计的思想:把大问题分解成若干个小问题,每个小问题就是一个独立的子模块,以实现特定的功能,在C语言中,子模块的作用就是通过函数完成的。
二:函数的分类
C语言中有标准函数与自定义函数两大类。
1. 1 标准函数
#include<stdio.h>
int main()
{
printf("helloworld");
return 0;
}
以上一小段代码各位都应该挺熟悉吧,在我们C语言学习初步阶段就是这一段代码将我们领入C语言这个神奇的国度。在以上一小段代码中的“int main()”便是C语言中的标准函数,此外还有scanf等函数,这些标准函数都是C语言所自带的,可供大家直接使用。
1.2 自定义函数
在我们C语言代码编写过程中,可能会存在某个小问题需要重复完成多次的情况,若在编写过程中,同类问题多次重复编写程序的话那难免有些费时费力。而C语言中的自定义函数可以帮助我们很好地解决这些问题。这样光凭文字可能理解起来不是很形象,接下来给大家展示在解决同一问题的情况下使用自定义函数与否在编写过程中有多大的区别
试求1到10,20到30,35到45这三组数之和
#include<stdio.h>
int main()
{
int i
int sum
for(i=1;i<10;i++)
{
sum += i;
printf("从%d到%d的和为%d",1,10,sum);//循坏1求1到10的和
}
for(i=20;i<30;i++)
{
sum += i;
printf("从%d到%d的和为%d",20,30,sum);//循环2求20到30的和
}
for(i=35;i<45;i++)
{
sum += i;
printf(" 从%d到%d的和为%d",35,45,sum);//循环3求35到45的和
}
return 0;
}
以上为在使用循环语句来解决这一问题,在我看来,循环语句在C语言中是十分实用且有效的语句,但在解决这一问题显得略为繁琐。
下面让我们再看看自定义函数选手的表现如何吧。
#include<stdio.h>
void sum(int begin,int end)//定义函数
{
int i;
int sum;
for(i>=begin;i<=end;i++)//for循环进行求和运算
{
sum += i;
printf("%d到%d的和为%d",begin,end,sum);
}
}
int main()
{
sum(1,10);//引用自定义函数
sum(20,30);//引用自定义函数
sum(35,45);//引用自定义函数
return 0;
}
结果很明显,在解决这一问题上,自定义函数选手明显更加简洁明了,同样也很有效。想不到吧,小小的自定义函数竟有如此大的作用。诶,这时可能有人注意到了,出现了一个之前都没有见过的单词——void。各位先别急,接来下会给大家解答“void”和“int”这俩小玩意儿的区别
2 有返回值函数与无返回值函数
这里就给大家简单说一下,像int main()这样的函数执行完毕后,会向调用者返回一个执行结果,被称为函数的返回值。而void main()则不用向调用者返回这一返回值。
#include<stdio.h>
int main()
{
printf("helloworld");
return 0;//执行完毕后返回0
}
#include<stdio.h>
void main()
{
printf("helloworld");
//执行完毕后不返回任何值
}
3.有参函数与无参函数
1,无参函数
在函数的调用,定义和声明中均不带参数。在调用函数时不会把数据传送给被调用函数,此类函数通常被用来完成特定的功能,可以返回或不返回函数值。
#include<stdio.h>
/*
格式:
类型说明 函数名()
{
//函数体
}
*/
int sum()
{
//函数体
}
2,有参函数
在函数的定义和声明中都必须有参数。在主调函数调用被调函数时,主调函数必须把值传输给形参,以供背调函数使用
#include<stdio.h>
int max(int a,int b)//有参函数
{
函数体
}
ps:参数在C语言中又分为实参和形参
什么是实参呢?
,函数后面括号中的参数称为“实参”,是我们真实传递给函数的参数,在调用有参函数时实参可以是常量,变量,表达式,函数等。
无论实参是何种类型的量,在进行函数调用时必须都有确定的值,以便把这些值传送给形参。写一小段代码来帮助大家理解一下吧
#include<stdio.h>
int sum(int a,int b)
{
sum = a + b;
}
int main()
{
int a = 51;
int b = 200;
int ret1 = sum(51,200);//实参为常量
printf("%d",ret1);
int ret2 = sum(a,b);//实参为变量
int ret3 = sum(a + b,a - b);//实参为表达式
int ret4 = sun(sun(1,1),249);//实参为函数
return 0;
}
在上段代码中,在主函数中调用sum函数,sum函数后面括号中的值都会传输到代码开头的sum函数中进行运算,再将值返回到主函数中。
什么是形参呢?
根据我个人的拙见,形参在实参向其传输数据之前是无意义的,正如其名“形参”一样,只是形式上的参数。但它可以接收多个实参传输过来的值并根据函数体进行相应的处理。我们拿上文的一段代码来举一个例子吧。
#include<stdio.h>
void sum(int begin,int end)//其中的begin与end都是形参
{
int i;
int sum;
for(i>=begin;i<=end;i++)
{
sum += i;
printf("%d到%d的和为%d",begin,end,sum);
}
}
int main()
{
sum(1,10);//1和10为实参,1和10分别传输给begin和end进行处理
sum(20,30);//20和30为实参,20和30分别传输给begin和end进行处理
sum(35,45);//35和45为实参,35和45分别传输给begin和end进行处理
return 0;
}
如注释一样,主函数中引用sum函数,在sum函数后括号中的实参传送到sum函数的定义中进行处理,再将处理后的结果返回给主函数中。
但我们需注意的是,形参只在函数中有用,如果在函数外部使用形参,这是会出现错误的。
同样的,咱们用上文的一段代码来进行演示
#include<stdio.h>
int sum(int a,int b)
{
sum = a + b;
}
int main()
{
int a = 51;
int b = 200;
int ret1 = sum(51,200);//实参为常量
printf("%d,%d",a,b);
//此时a和b两个形参在函数外被使用,运行时会报错,显示未定义字符a和b
printf("%d",ret1);
int ret2 = sum(a,b);//实参为变量
int ret3 = sum(a + b,a - b);//实参为表达式
int ret4 = sun(sun(1,1),249);//实参为函数
return 0;
}
三,函数的定义与调用
1,函数原型(函数的声明)
细心的同学可能会发现本篇代码块与我们刚学习时有一点点不同的地方。这里我也不卖关子了,在我们之前的学习中在“#include<stdio.h.>之后就紧跟着int main()。而今天的代码块却不是这样,是为啥嘞。其实在我们c语言编译运行过程是从上至下的,若不将我们所需调用的函数在主函数前编写出来的话,在执行主函数时会报错,因为编译器识别不了你调用的函数是什么东西,代表什么意思,长什么样子。我们可以先对函数进行一个简单的声明,来确保后面的主函数在编译时不会出错。
#include<stdio.h>
void sum(int a,int b)//对sum函数进行声明
int main()
{
sum += 1;//此处对sum的默认为int型,若开头无sum函数的声明,会与下面sum函数的类型冲突
}
void sum(int a,int a)//注意此处对sum的类型定义要与上面相同
{
函数体
}
四,从函数中返回
1,函数的返回值指的是在函数被调用后,执行函数中代码所得到的的结果通过return语句返回
return语句的一般格式为
return 表达式
而没有返回值的函数为空类型,就用void来表示
如:
#include<stdio.h>
void max()
{
函数体
}
int main()
{
int a = max ()//函数max()的返回值被定义为void型,这里便接收不到它的值了
}
2,C语言中return语句可以有多个,但是每次调用函数只能有一个return语句被执行,只有一个返回值。
3,函数一遇到return语句就立即返回,return语句后面的语句都不会被执行。有点强制结束函数执行的感觉。
//返回两个整数中较大的一个
#include<stdio.h>
int max(int a,int b)
{
return 0
//此处return语句返回0,后面的语句都不会执行
if(a > b)
{
printf("两个数中较大的一个是%d\n",a);
}
else
{
printf("两个数中较大的一个是%d\n",b);
}
}
学到这里我也终于明白为什么我们之前学习过程中return语句总是放在最后了。