目录
main函数和库函数
什么是函数
函数定义
函数头(function header)
1.返回类型(return type)
2.函数名(function name)
3.形参声明(parameter type list)
函数体(function body)
函数调用
求三个数中的最大数
将函数的返回值作为参数传递给函数
调用其他函数
值传递
程序由多个零件组合而成,而函数就是这种“零件”的一个较小单位。接下来我们来学习函数的基本知识。
main函数和库函数
截至目前为止,我们一直都在的程序格式如下:
#include<stdio.h>int main()
{/*………………*/return 0;
}
蓝底字部分称为main函数,在C语言中是必不可少的,在程序执行时,会执行main函数的主体部分。
main函数中使用了printf、scanf、putchar等众多函数,由C语言提供的众多函数称为库函数。
什么是函数
所谓函数,来源于数学术语函数(function),具有功能、职责的作用。所以每一个函数,就相当于完成任务的一个工具。
我们可以自己来创建各种函数,这也是我们必须学会的。
printf函数和scanf函数等创建好的函数,即使不知道内容,只要了解其使用方法,也可以轻松使用,就像是一个魔法盒一样。
要像精通这个魔法盒一样的函数,需要我们站在函数创建者和使用者双方的立场上,进行两种学习
函数的创建方法——函数定义
函数的使用方法——函数调用
函数定义
我们先来学习函数的创建方法,定义一个max2的函数
#include<stdio.h>int max2(int a, int b)
{if(a > b)return a;elsereturn b;
}
这个函数定义有多个部分构成:
函数头(function header)
该部分表示函数的名称和格式。实际上称作函数的脸更合适。
1.返回类型(return type)
函数返回的值——返回值(return value)的类型。该函数的情况下,返回的两个的是两个int型数值最大的一个,其类型是int型。
2.函数名(function name)
函数的名称,从其他零件调用函数时,使用函数名。
3.形参声明(parameter type list)
小括号扩起来的部分,适用于接收辅助性提示的变量——形式参数的声明,使用多个参数时用逗号隔开。
函数体(function body)
函数体是复合语句。仅在某个函数中使用的变量,原则上应在该函数中声明和使用。但要注意不能声明和形参同名的变量,否则会发生变量名的冲突。
函数调用
我们已经知道了函数的创建方法(函数定义),接下来让我们学习函数的使用方法(函数调用)。
让我们先创建一个求最大值的函数并且调用它:
#include<stdio.h>int max2(int a, int b)
{if(a > b)return a;elsereturn b;
}
int main()
{int n1, n2;puts("请输入两个整数:");printf("整数1:"); scanf("%d", &n1);printf("整数2:"); scanf("%d", &n2);printf("较大的整数是%d\n", max2 (n1, n2));}
该程序定义了两个函数max2和main,程序首先执行的是main函数(虽然max2函数定义在main函数之前)。使用函数的过程称为调用函数。
我们来用图具体说明在调用函数,程序时怎么执行的:
我们可以说:函数max2,给你两个值,哪个值最大?
函数调用的形式是在函数名后面加上小括号,这个小括号称为函数调用运算符,使用函数调用运算符的表达式称为函数调用表达式。
1.函数调用运算符括起来的是实参,实参可以有多个,需要用逗号隔开。
2.进行函数调用后,程序的流程将会一下调到该函数处,main函数立刻停止,开始执行max2函数。
3.在被调用的一方,会生成用于形参的变量(在函数定义时形参并不是实际存在的),并赋予实参的值。
4.形参完成初始化后,将会执行函数体,程序在执行时遇到return语句或者是循环体最后的 } ,就会从该函数跳转到调用函数。return后面的表达式(比如说return b)在回到调用函数main函数时,可以看为给它带的一个小礼物。
返回值是通过对函数调用表达式进行判定而得到的。
比如a=5,b=6.6,由于函数返回类型时int型,所以得到的判定结果就是int 6
x(arg) 向函数传递实参arg并调用,如果返回值类型不是void,则生成函数x返回的值。 |
关于返回值类型void,我们会在下一节中学到。
函数调用时传递的只是参数的值,因此使用的实参既可以是变量也可以是常量。例如:
max (n1, 5)
另外,实参和形参是两个不同的东西,因此不用担心它们名字相同。
接下来我们看下return语句的结构:
函数返回的是表达式的值,不能有两个。
接下来我们来看看关于max2函数的其他定义的方法:
/*第一种*/
int max2(int a, int b)
{int max;if(a > b)max = a;elsemax = b;return max;
}
/*第二种*/
int max2(int a, int b)
{int max = a;if(b > max)max = b;return max;}
/*第三种*/
int max2(int a, int b)
{return (a > b) ?a : b;//使用了条件运算符
}
在第一种函数和第二种函数,都使用了变量max,像这样只在某个函数中使用的变量,需要在该函数中进行声明,但是不能与形参的名字重复,否则会发生变量名的冲突。
求三个数中的最大数
我们学习完函数的定义与声明后,应该初步会编写一些简单的程序了,接下来我们来编写求三个数中的最大数的值
#include<stdio.h>int max3(int a, int b, int c)
{int max = a;if(b > max) max = b;if(c > max) max = c;return max;
}int main()
{int n1, n2, n3;printf("整数1:"); scanf("%d", &n1);printf("整数2:"); scanf("%d", &n2);printf("整数3:"); scanf("%d", &n3);printf("最大值是%d。\n", max3 (n1, n2, n3 ));return 0;
}
将函数的返回值作为参数传递给函数
#include<stdio.h>/*返回x的平方*/
int sqr(int x)
{return x * x;
}/*返回x和y的值*/
int diff(int a, int b)
{return (a > b) ?a - b:b - a;
}int main()
{int x, y;puts("请输入俩个整数:");printf("整数1:"); scanf("%d", &x);printf("整数2:"); scanf("%d", &y);printf("两个整数的平方差是%d", diff(sqr(x), sqr(y)));return 0;
}
1.该程序中先调用函数sqr,把实参的值传递给x,进行平方后得到返回值。
2.再把返回值作为实参传递给函数diff中的形参a和b,对该表达式进行判断后得到返回值
3.最后main函数直接将返回值传递给printf函数并显示。
调用其他函数
截止到目前为止,我们都是在main函数中调用库函数或我们自己创建的函数,现在我们来学习在自己创建的函数调用其他函数。
#include<stdio.h>/*返回较大值*/
int max2(int a, int b)
{return (a > b) ? a : b;
}/*返回四个整数中的最大值*/
int max4(int a, int b, int c, int d)
{return max2(max2(a, b), max2(c, d));
}int main()
{int n1, n2, n3, n4;printf("整数1:"); scanf("%d", &n1);printf("整数2:"); scanf("%d", &n2);printf("整数3:"); scanf("%d", &n3);printf("整数4:"); scanf("%d", &n4);printf("最大的整数是%d", max4(n1, n2, n3, n4));return 0;
}
我们来拆解分析下:
1.首先在main函数中调用max4函数,main函数立刻停止,把实参赋值给max4中的形参。
2.然后在max4函数中调用两次max2函数,第一求a和b中较大数、c和d中较大数第二次调用 比较它们二者比较后得出的较大数。
3.最后main函数把返回值传递给printf函数并显示。
通过这个案例,我们可以认为函数就是一个程序的零件,例如想实现显示功能时,就调用printf函数这个零件。在制作零件的时候,如果有其他方便的零件,我们也可以大量使用。
值传递
我们来创建一个计算幂的函数。
#include<stdio.h>/*返回x的n次幂*/
int power(double x, int n)
{int i;double tmp = 1.0;for(i = 1; i <= n; i++){tmp *= x;}return tmp;
}int main()
{double a;int b;printf("求a的b次幂。\n");printf("实数1:"); scanf("%lf", &a);printf("整数2:"); scanf("%d", &b);printf("%.2f的%d次幂是%.2f。\n", a, b, power(a, b));return 0;
}
形参x被赋上实参a的值,形参n被赋上b的值,像这样通过值来进行参数传递的机制称为值传递。
注意
函数间参数的传递称是通过值传递进行的。
形参x是实参a的副本,形参n是实参b的副本,所以在调用一方的函数power,即使改变所接受的形参的值,调用的实参也不会受影响。
到此为止,我们已经学习了函数一部分的基础知识,关于函数部分虽然有些抽象,但不要畏难,多看几遍书和视频讲解,相信大家都能乘风破浪。