目的:学习什么是函数,运用函数编写编程
4.1什么是函数
1.函数
a:别名:子程序,function
b:定义:是一个大型程序中的某部分代码,由一个和多个语句块组成,它负责完成某项特定任务,而且相较于其他代码而言,具有相对的独立性,一个函数就是一个功能
c:一些小知识:
(1)每个程序必须有一个主函数,但只能有一个,位置没固定
(2)是以程序文件模块为编译单位,可以有一个或多个文件
(3)一个程序文件可以包含若干函数
(4)程序总是从main函数中开始执行的,主函数可以调用其他函数,其他函数之间也可以相互调用,在C++中主函数或其他函数可以通过类对象调用类中的函数,C语言中没有类,他也是被认为是面向函数的语言
2.函数的调用
注意⚠️:
a:程序的执行从main函数开始,调用其他函数后流程回到main函数,在main函数中结束整个程序的运行,main由系统调用
b:所有函数都是都是平行的,在定义函数时是相互独立的,可以理解他们都是平级的关系,main函数是他们的大哥,及函数不能嵌套定义(就是在定义一个函数时的过程中又定义一个函数),也不能把函数的定义部分写在主函数中
c:main可以调用其他函数,其他函数也可以互相调用,但是main函数不可以被调用
3.函数的分类:系统函数(库函数)+用户自己定义的函数(有参函数+无参函数)
a:库函数:有编译系统提供的,
注意⚠️:在头文件中加入相应的库函数,不用声明,就可以用里面的函数,例如:include
b:用户自己定义的函数:为解决用户专门需要而自己设置的
(1)无参函数:调用时可以不给出参数,则主调函数就不会把相应的值传给被调用函数
(2)有参函数:在调用时,要给出参数,主调函数和被调用函数有数据的传递,这里也分为传值和传址,有区别,后面的章节也会提到,如果感兴趣的朋友可以提前了解
4.2定义函数的一定形式
1.定义无参函数的一般形式:
类型名 函数名 ([void])“[ ]”表示可省略可不省略
{
声明部分
执行部分
}
int star (void)
{
cout<<"*********";
return 0;
}
void int star (void)
{
cout<<"*********";
}
int main(void)
{
return 0;
}
注意⚠️:
a:若想要没有返回值,就要在类型名前面加上void,无参数就是在圆括号内加上void(可省略),最好不省略,因为可以区分是无返回值还是无参数,更加清楚
b:圆括号里面的无参函数函数的参数是指形式参数,一会也会讲到实参和形参
c:其实主函数也是一个没有参数的函数,只是我们在过程中省略掉了void
2.定义有参函数的形式:
类型名 函数名 (形式参数列表)
{
声明部分
执行部分
}
int max (int x,int y)//这里的x和y是可以是可以省略的,因为形参
{
int z;
z=x>y?x:y;
return (z);
}
void max (int ,int )//无返回值
{
int z;
z=x>y?x:y;//三目运算符
}
4.3 函数参数和函数的值
1.形式参数和实际参数
a:形式参数(形参):在定义函数时函数后面括号的变量名就是形参(formal parameter),未被调用时是没有储存空间的
b:实际参数(实参):在主调函数中调用一个函数时,函数名后面括号中的参数(actual parameter)或者一个表达式,有储存空间的
#include
using namespace std;
int main()
{
int a=0,b=0,c=0;
int max(int x,int y);//x,y是形参,可以省略
cout<<"你要比较的两个数:";
cin>>a>>b;
c=max(a,b);//a,b是实参,不可省略
cout<<"更大的那个数是(若输出0则相等):"<y)
return x;
else if(x
补充—实参与形参的关系:
a:形参相当于是实参的临时拷贝,把他带入函数中进行我们想要的运算
b:在函数未被调用时,形式参数也称虚拟参数并不占内存,在调用时会分配内存单元,调用结束时内存释放
c:实参的形式可以是表达式、常量、变量,例如:c=max(3,a+b)
d:在声明函数时,必须声明变量的类型,类型万万不能省略
e:实参与形参的类型应相同或者赋值兼容,字符型和整型可以互相通用,如果不同,就会按照转换规则进行转换(图片来自网络)
f:实参对形参的数据传递是“值传递”,也是单向传递,意思就是形参的值不会传回实参,所以形参改变了不会影响实参,但实参改变了会影响形参,且分配的储存单元是不一样的
2.函数的返回值(口诀:谁调用就返回谁)
a:返回值的定义:用过函数的调用使主函数能得到一个确定的函数值,这就是函数的返回值
b:函数的返回值是通过return语句获得的
补充—return语句:
a:return语句的作用,在被调用函数中得到的确切值带到主调函数中去
b:若需要返回值则要用return语句,但是不需要返回值时,则可以不写return语句,但是前面要加上void(void用法详见4.2)
c:return语句后面的括号可要可不要,一个函数里可以有多个return语句
d:那这会有一个问题,返回值的类型是在哪里表明的呢?是在定义有参函数或无参函数上的类型名所决定的,如果函数值与返回值类型不同,则已函数类型为准,对数值型数据,可进行自动进行类型转换
int max(float x,float y);//返回值是int型
double max(int x,int y);//返回值是double型,虽然输出是整型数据,
//是因为我们赋值时取的是int型,但输出其实是double型,
//例如输入4.4,3.14,输出4,这个4是double型的
void max(int x,int y);//无返回值
口诀:函数类型是啥,返回值类型就是啥
4.4函数的调用
1.调用函数的一半形式:函数名 ([实参列表])
有参形式函数调用时实参不可省略,无参形式函数的调用时可以省略实参
补充—调用的分类:传值+传址
a:传值:形参改变并不影响实参,因为内存块不同
b:传址:形参的改变会有影响实参,这种调用可以使函数和函数外的变量正真联系起来
2.调用的方式有(按语句分类):函数语句+函数表达式+函数参数
a:函数语句(常见于void类的函数调用):把函数调用单独作为一个语句,并不要求函数带回一个值,只要求完成一定的操作,一般常见于void类的函数,在进行调用时,直接写出语句,各位朋友在编程时一定会有相关的经历
b:函数表达式(常见于有返回值的函数调用):函数出现在一个表达式时中,这时要求函数带回一个确定的值以参加表达式的运算
c:函数参数:函数调用做为一个函数的实参,可以理解为把原本一个变量或者其他形式的参数改为了函数调用形式的参数
display();//函数语句
c=max(x,y);//函数表达式
m=max(x,sqrt(n));//“sqrt(n)”本身就是函数的调用
3.函数被调用的条件:
a:这个被调用函数是已经存在的
b:如果使用库函数,还应在本头文件开头用#include指令将有关头文件“包含”,才能使用库函数中的函数
c:如果使用自己定义的函数,就要在主调函数里面声明函数(函数声明就是在函数未定义的情况下,事先将该函数的有关信息通知编译系统)
4.函数的声明:把函数的名字、函数的类型以及形参个数、类型和顺序告诉编译系统,但不包括函数体,有参数的话,可以省略变量名,只写形参类型
a:告诉编译起有一个函数叫什么,是否有参数,有参数的话参数是什么,但是具体是不是存在,无关紧要。
b:函数的声明一般出现在函数的使用之间,满足先声明后使用
c:函数的声明一般要放在头文件中
5.函数的定义:指函数的具体表现,交代函数的具体功能实现,否则会使编译器误认为后面为独立语句
6:定义和声明的联系:
a:定义不加分号,声明要加分号
b:如果被调用函数的定义出现在主调函数之前,可以不必加声明
c:函数的声明可以在调用函数所在的函数中,也可以函数之外,如果函数声明发在函数的外部,在所有函数之前(对函数的外部声明),则在各个主调函数中不必对所调用的函数在作声明,一个函数被多个函数所调用,就可以用这个方法
#include
using namespace std;
int main()
{
int a=0,b=0,c=0;
int max(int x,int y);//x,y是形参,可以省略,函数声明
cout<<"你要比较的两个数:";
cin>>a>>b;
c=max(a,b);//a,b是实参,不可省略
cout<<"更大的那个数是(若输出0则相等):"<y)
return x;
else if(x
7.函数原型:
a:作用:根据函数原型在程序编译阶段对调用函数的合法性进行全面检查,调用函数与函数原型的类型不同的话,会报错
b:形式:函数类型 函数名(参数类型1,参数类型2···)
函数类型 函数名(参数类型1,参数类型2 参数名2,····)
c:函数原型与函数首部写法一致
4.5函数的嵌套调用(是函数有机结合在一起)
但注意⚠️:不是嵌套定义,而是嵌套调用函数
1.理解:就是在调用一个函数的过程中,又调用另一个函数
共同学习,欢迎指正!