函数函数(Function)是功能抽象的模块.ppt
中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010第第4 4章章 函数函数 函数(函数(FunctionFunction)是功能抽象的模块是功能抽象的模块函数函数参数参数返回值返回值输入流输入流输出流输出流中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010第第4 4章章 函数函数 函数(函数(FunctionFunction)是功能抽象的模块是功能抽象的模块 函数作用函数作用 实现一个功能;代码重用实现一个功能;代码重用 函数是函数是C+C+程序的重要组件程序的重要组件 一个程序文件可以包含若干个函数,无论把一个程序划分为多少个程序模块,只能有一个main函数。中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010初步的认识1定义printstar和print_message函数时,括号内的void表示“没有参数函数”,即调用此函数时不必也不能给出参数。2程序的执行从main函数开始,调用其他函数后流程回到main函数,最后在main函数中结束整个程序的运行。3所有函数都是平行的,即在定义函数时是相互独立的。但函数不能嵌套定义,也即在定义一个函数过程中不能又定义另外一个函数,同时也不能把函数的定义部分写在主函数中。4main可以调用其他函数,各个函数之间可以互相调用,但不能调用main函数。5main函数所调用的函数,前面必须进行声明。根据函数的形式:无参函数:调用函数时,不必给出参数有参函数:在调用函数时,要给出参数中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010函数定义由两部分组成:函数首部和函数操作描述4.1 4.1 4.1 4.1 函数的定义函数的定义函数的定义函数的定义/求圆柱体体积求圆柱体体积#includedoublevolume(doubleradius,doubleheight)return3.14*radius*radius*height;voidmain()doublevol,r,h;cinrh;vol=volume(r,h);coutVolume=volendl;中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20104.1 4.1 4.1 4.1 函数的定义函数的定义函数的定义函数的定义/求圆柱体体积求圆柱体体积#includedouble volume(double radius,double height)return 3.14*radius*radius*height;voidmain()doublevol,r,h;cinrh;vol=volume(r,h);coutVolume=volendl;函数定义函数定义中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20104.1 4.1 4.1 4.1 函数的定义函数的定义函数的定义函数的定义/求圆柱体体积求圆柱体体积#includedouble volume(double radius,double height)return 3.14*radius*radius*height;voidmain()doublevol,r,h;cinrh;vol=volume(r,h);coutVolume=volendl;函数调用函数调用中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010函数定义形式函数定义形式 类型类型 函数名函数名(void)语句序列语句序列 4.2 4.2 函数参数函数参数 3.1.1 3.1.1 函数定义函数定义类型类型 函数名函数名(形式参数表形式参数表)语句序列语句序列 无参函数有参函数形式参数和实际参数形式参数:在定义函数时函数名后面括号中的变量名称为形式参数实际参数:在主函数中调用一个函数时,函数后面括号中的参数中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010函数定义形式函数定义形式 类型类型 函数名函数名(形式参数表形式参数表)语句序列语句序列 4.2 4.2 函数定义和参数函数定义和参数 函数头函数接口,包括:3.1.1 3.1.1 函数定义函数定义中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010函数定义形式函数定义形式 类型类型类型类型 函数名函数名(形式参数表形式参数表)语句序列语句序列 4.2 4.2 函数定义和参数函数定义和参数 函数头函数接口,包括:函数返回值类型函数返回值类型函数返回值类型函数返回值类型 函数体中由return语句返回的值的类型。没有返回值其类型为void3.1.1 3.1.1 函数定义函数定义中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010函数定义形式函数定义形式 类型类型 函数名函数名函数名函数名(形式参数表形式参数表)语句序列语句序列 4.2 4.2 函数定义和参数函数定义和参数 函数头函数接口,包括:函数返回值类型 函数体中由return语句返回的值的类型。没有返回值其类型为void函数名函数名函数名函数名 用户定义标识符3.1.1 3.1.1 函数定义函数定义中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010函数定义形式函数定义形式 类型类型 函数名函数名(形式参数表形式参数表形式参数表形式参数表)语句序列语句序列 4.2 4.2 函数定义和参数函数定义和参数函数头函数接口,包括:函数返回值类型 函数体中由return语句返回的值的类型。没有返回值其类型为void函数名 用户定义标识符形式参数表形式参数表形式参数表形式参数表 逗号分隔的参数说明表列,缺省形式参数时不 能省略圆括号。一般形式为:类型 参数1 ,类型 参数2,类型 参数n3.1.1 3.1.1 函数定义函数定义中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010函数定义形式函数定义形式 4.2 4.2 函数定义函数定义 函数头函数接口类型类型 函数名函数名(形式参数表形式参数表)语句序列语句序列语句序列语句序列 函数体函数体函数体函数体函数的实现代码。3.1.1 3.1.1 函数定义函数定义中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010例例3-1 4.2 4.2 函数定义函数定义 voidprintmessage()coutHowdoyoudo!endl;3.1.1 3.1.1 函数定义函数定义中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010例例3-14.2 4.2 函数定义函数定义 voidprintmessage()coutHowdoyoudo!endl;函数返回值类型函数返回值类型无返回值无返回值3.1.1 3.1.1 函数定义函数定义中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010例例3-14.2 4.2 函数定义函数定义 voidprintmessage()coutHowdoyoudo!endl;函数名函数名3.1.1 3.1.1 函数定义函数定义中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010例例3-14.2 4.2 函数定义函数定义 voidprintmessage()coutHowdoyoudo!endl;形式参数表形式参数表无参数无参数3.1.1 3.1.1 函数定义函数定义中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010例例3-14.2 4.2 函数定义函数定义 voidprintmessage()cout How do you do!y)returnx;elsereturny;3.1.1 3.1.1 函数定义函数定义中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010例例3-24.2 4.2 函数定义函数定义 doublemax(doublex,doubley)if(xy)returnx;elsereturny;函数返回值类型函数返回值类型3.1.1 3.1.1 函数定义函数定义中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010例例3-24.2 4.2 函数定义函数定义 doublemax(doublex,doubley)if(xy)returnx;elsereturny;函数名函数名3.1.1 3.1.1 函数定义函数定义中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010例例3-24.2 4.2 函数定义函数定义 doublemax(double x,double y)if(xy)returnx;elsereturny;形式参数表形式参数表3.1.1 3.1.1 函数定义函数定义中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010例例3-24.2 4.2 函数定义函数定义 doublemax(doublex,doubley)if(x y)return x;else return y;函数体函数体3.1.1 3.1.1 函数定义函数定义中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010例例3-24.2 4.2 函数定义函数定义 doublemax(doublex,doubley)if(xy)return x;elsereturn y;返回值返回值return 语句形式:return 表达式 或return(表达式)作用:返回函数值 不再执行后续语句,程序控制返回调用点 一个函数体内可以有多个return 语句 表达式返回值的类型与函数类型不相同时,自动强制转换成函数的类型3.1.1 3.1.1 函数定义函数定义中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010(1)在定义函数时指定的形参,在未出现函数调用时,他们并不占内存中的存储单元,(所以称他们为形式参数或虚拟参数),表示他们并不是实际存在的数据。只有在发生函数调用时,函数中的形参才被分配内存单元,以便接受从实参传来的数据。在调用结束后,形参所占的内存单元也被释放。(2)实参可以是常量,变量或表达式。(3)定义函数时,必须在函数首部指定形参的类型。(4)实参与形参的类型应相同或赋值兼容。如果两者不相同,则按照赋值的规则进行转换。(5)实参变量对形参变量的数据传递时“值传递”,即单向传递,只有实参传给形参,而不能又形参传回给实参。中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20104.3 4.3 函数的返回值函数的返回值函数通过匿名对象返回结果值函数值的类型是匿名对象的类型return语句把表达式的值赋给匿名对象TypeTypeFunctionName()/statementsreturnreturnexpressionexpression;TypeType Objexpressionexpression TypeType 可以为各种C+基本数据类型、类类型,以及这些类型的指针或引用3.2.4 函数的返回类型中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010(1)函数的返回值是通过函数中的return语句获得的。return语句将被调用函数中的一个固定值带回主函数中。(2)函数值的类型。既然函数有返回值,这个值的类型由定义函数时指定函数值的类型来确定。(3)如果函数值的类型和return语句中的表达式的值不一致,则以函数类型为准,即函数类型决定返回值的类型。中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010调用形式调用形式 函数名函数名(实际参数表列实际参数表列)4.4 4.4 函数的调用函数的调用3.1.2 3.1.2 函数调用函数调用如果调用无参函数,则“实际参数表列”可以没有,但括号不能省略。如果实参表列包括多个多个参数,则各参数间用逗号隔开。实参和形参的个数应该相等,类型匹配或者赋值兼容,顺序一一对应进行传递数据。中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010调用形式调用形式 函数名函数名函数名函数名(实际参数表实际参数表)4.4 4.4 函数的调用函数的调用函数名函数名函数名函数名 函数的入口地址函数的入口地址3.1.2 3.1.2 函数调用函数调用中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010调用形式调用形式 函数名函数名(实际参数表实际参数表实际参数表实际参数表)4.4 4.4 函数的调用函数的调用函数名函数名 函数的入口地址函数的入口地址实际参数表实际参数表实际参数表实际参数表 与形式参数必须在个数、类型、位置一一对应与形式参数必须在个数、类型、位置一一对应3.1.2 3.1.2 函数调用函数调用中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20104.4函数的调用按函数在语句中的作用来分,可以有以下3种函数调用方式:1函数语句:把函数调用单独作为一个语句,并不要求函数带回一个值,只是要求函数完成一定的操作。printstar();2函数表达式:函数出现在一个表达式中,要求函数带回一个确定的值以参加表达式的运算。C=2*max(a,b)3函数参数:函数调用作为一个函数的实参。m=max(a,max(a,b);中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20104.4 4.4 函数调用函数调用#includevoidprintmessage()coutHowdoyoudo!endl;voidmain()printmessage();例例3-13.1.2 3.1.2 函数调用函数调用中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20104.4 4.4 函数调用函数调用#includevoidprintmessage()coutHowdoyoudo!endl;voidmain()printmessage();函数调用语句函数调用语句例例3-13.1.2 3.1.2 函数调用函数调用中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20104.4 4.4 函数调用函数调用例例3-2#includedoublemax(doublex,doubley)if(xy)returnx;elsereturny;voidmain()doublea,b;cinab;doublem=max(a,b);coutmax(m,3.5)endl;3.1.2 3.1.2 函数调用函数调用中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20104.4 4.4 函数调用函数调用例例3-2#includedoublemax(doublex,doubley)if(xy)returnx;elsereturny;voidmain()doublea,b;cinab;doublem=max(a,b);coutmax(m,3.5)endl;函数调用表达式函数调用表达式3.1.2 3.1.2 函数调用函数调用中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20104.4 4.4 函数调用函数调用例例3-2#includedoublemax(doublex,doubley)if(xy)returnx;elsereturny;voidmain()doublea,b;cinab;doublem=max(a,b);coutmax(m,a+3.5)endl;coutmax(max(a,b)max(a,b),a+3.5a+3.5)endl;实际参数是表达式实际参数是表达式3.1.2 3.1.2 函数调用函数调用中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010(1)首先被调用的函数必须是已经存在的函数(是函数库或者用户自己定义的函数)(2)如果是使用库函数,一般还应该在本文件开头用#include命令将有关头文件“包含”到本文件中来。例如,如果用到数学库函数,就用#include(3)如果使用用户自己定义的函数,该函数必须跟主函数在同一个程序单元中,如果位置在主函数之后,则必须在调用此函数之前对被调用函数之前进行声明。4.4.1 调用函数的前提(调用函数的声明)中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010定义函数和声明函数的区别定义:对函数功能的确立,包括指定函数名,函数类型,形参及其类型,函数体等。是一个完整的、独立的函数单位。声明:仅把函数的名字,函数类型及其形参的个数,类型和顺序通知编译系统。声明函数中可以不写形参名,而写形参的类型。如:#includedoublevolume(double,double);voidmain()doublevol,r,h;cinrh;vol=volume(r,h);coutVolume=volendl;doublevolume(doubleradius,doubleheight)return3.14*radius*radius*height;中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20104.4.2 4.4.2 函数原型函数原型函数原型的作用是告诉编译器有关函数的信息:函数的名字函数返回的数据类型函数要接受的参数个数、参数类型和参数的顺序编译器根据函数原型检查函数调用的正确性函数原型的形式:类型 函数名(形式参数表);3.1.3 3.1.3 函数原型函数原型函数声明中也可以不写形参名,而只写形参的类型。例如:doublevolume(double,double);函数原型是函数原型是声明语句声明语句中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20104.4.2 4.4.2 函数原型函数原型#includedoublemax(double,double);/函数原型函数原型voidmain()doublea,b,c,m1,m2;coutabc;m1=max(a,b);/函数调用函数调用m2=max(m1,c);coutMaximum=m2y)returnx;elsereturny;使用函数原型使用函数原型3.1.3 3.1.3 函数原型函数原型中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20104.4.1 4.4.1 函数原型函数原型#includedouble max(double,double);/函数原型函数原型voidmain()doublea,b,c,m1,m2;coutabc;m1=max(a,b);/函数调用函数调用m2=max(m1,c);coutMaximum=m2y)returnx;elsereturny;函数原型的参数表函数原型的参数表不需要参数名不需要参数名使用函数原型使用函数原型3.1.3 3.1.3 函数原型函数原型中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20104.4.1 4.4.1 函数原型函数原型#includedouble max(double,double);/函数原型函数原型voidmain()doublea,b,c,m1,m2;coutabc;m1=max(a,b);/函数调用函数调用m2=max(m1,c);coutMaximum=m2 y)return x;else return y;函数调用出现在定义之前函数调用出现在定义之前函数原型声明是必须的函数原型声明是必须的使用函数原型使用函数原型3.1.3 3.1.3 函数原型函数原型中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20104.4.1 4.4.1 函数原型函数原型函数定义在调用之前函数定义在调用之前#includedoublemax(doublex,doubley)/函数定义函数定义if(xy)returnx;elsereturny;voidmain()doublea,b,c,m1,m2;coutabc;m1=max(a,b);/函数调用函数调用m2=max(m1,c);coutMaximum=m2endl;3.1.3 3.1.3 函数原型函数原型中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20104.4.2 4.4.2 函数原型函数原型函数定义在调用之前函数定义在调用之前#includedouble max(double x,double y)/函数定义函数定义 if(x y)return x;else return y;voidmain()doublea,b,c,m1,m2;coutabc;m1=max(a,b);/函数调用函数调用m2=max(m1,c);coutMaximum=m2endl;函数定义出现在调用之前函数定义出现在调用之前无必要作函数原型声明无必要作函数原型声明3.1.3 3.1.3 函数原型函数原型中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20104.4.2 4.4.2 函数原型函数原型函数原型函数原型说明说明intabs(intn);n的绝对值doublecos(doublex);x(弧度)的余弦doubleexp(doublex);指数函数exdoublefabs(doublex);x的绝对值doublefmod(doublex,doubley);x/y的浮点余数doublelog(doublex);x的自然对数(以e为底)doublelog10(doublex);x的对数(以10为底)doublepow(doublex,doubley);x的y次方(xy)doublesin(doublex);x(弧度)的正弦doublesqrt(doublex);x的平方根doubletan(doublex);x(弧度)的正切 math.h中几个常用的数学函数中几个常用的数学函数 3.1.3 3.1.3 函数原型函数原型中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20104.4.2 4.4.2 函数原型函数原型/例例3-3 用库函数求正弦和余弦值用库函数求正弦和余弦值#include#includevoidmain()doublePI=3.1415926535;doublex,y;x=PI/2;y=sin(x);coutsin(x)=yendl;y=cos(x);coutcos(x)=yendl;3.1.3 3.1.3 函数原型函数原型中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20104.4.2 4.4.2 函数原型函数原型/例例3-3 用库函数求正弦和余弦值用库函数求正弦和余弦值#include#include voidmain()doublePI=3.1415926535;doublex,y;x=PI/2;y=sin(x);coutsin(x)=yendl;y=cos(x);coutcos(x)=yendl;包含头文件包含头文件3.1.3 3.1.3 函数原型函数原型中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20104.4.2 4.4.2 函数原型函数原型/例例3-3 用库函数求正弦和余弦值用库函数求正弦和余弦值#include#includevoidmain()doublePI=3.1415926535;doublex,y;x=PI/2;y=sin(x);coutsin(x)=yendl;y=cos(x);coutcos(x)=yendl;调用库函数调用库函数3.1.3 3.1.3 函数原型函数原型中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010C+有三种参数传递机制:值传递指针传递引用传递4.24.24.24.2 函数参数的传递函数参数的传递函数参数的传递函数参数的传递 3.2 函数参数的传递中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20104.2.14.2.1 传值参数传值参数 调用函数时,实参表达式的值被复制到相应形参标识的对象中,并按形参类型强制转换函数内对形参的访问、修改,都在形参的标识对象进行函数返回时,形参对象被撤消,不影响实参的值值传送的实参可以是常量、有确定值的变量或表达式函数返回值通过匿名对象传递3.2.1 传值参数中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20101 1 1 1值传递机制值传递机制值传递机制值传递机制 /例例3-4 强制类型转换强制类型转换#includevoidmain()floatadd1(float,float);/函数原型函数原型floatadd2(int,int);/函数原型函数原型floata,b,c;cinab;c=add1(a,b);coutc1=cendl;c=add2(1/a,1/b);coutc2=cendl;floatadd1(floatx,floaty)return(x+y);floatadd2(inti,intj)return(i+j);3.2.1 传值参数中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010/例例3-4 强制类型转换强制类型转换#includevoidmain()floatadd1(float,float);/函数原型函数原型floatadd2(int,int);/函数原型函数原型floata,b,c;cinab;c=add1(a,b);coutc1=cendl;c=add2(1/a,1/b);coutc2=cendl;float add1(float x,float y)return(x+y);float add2(int i,int j)return(i+j);类型强制转换类型强制转换截取整数部分传送给形参截取整数部分传送给形参1 1 1 1值传递机制值传递机制值传递机制值传递机制 3.2.1 传值参数中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010#includeint add(int,int);void main()int a,b,c;cin a b;c=add(a,b);cout c=c endl;int add(int i,int j)i+;j+;return(i+j);abc int a,b,c;/例例3-5 值参传递值参传递1 1 1 1值传递机制值传递机制值传递机制值传递机制 3.2.1 传值参数中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010#includeint add(int,int);void main()int a,b,c;cin a b;c=add(a,b);cout c=c a b;/例例3-5 值参传递值参传递1 1 1 1值传递机制值传递机制值传递机制值传递机制 3.2.1 传值参数中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010#includeint add(int,int);void main()int a,b,c;cin a b;c=add(a,b);cout c=c endl;int add(int i,int j)i+;j+;return(i+j);abc24 c=add(a,b);/例例3-5 值参传递值参传递1 1 1 1值传递机制值传递机制值传递机制值传递机制 3.2.1 传值参数中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010#includeint add(int,int);void main()int a,b,c;cin a b;c=add(a,b);cout c=c endl;int add(int i,int j)i+;j+;return(i+j);abcij2424 int add(int i,int j)/例例3-5 值参传递值参传递1 1 1 1值传递机制值传递机制值传递机制值传递机制 3.2.1 传值参数中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 201024ij#includeint add(int,int);void main()int a,b,c;cin a b;c=add(a,b);cout c=c endl;int add(int i,int j)i+;j+;return(i+j);abc24243 35 5 i+;j+;/例例3-5 值参传递值参传递1 1 1 1值传递机制值传递机制值传递机制值传递机制 3.2.1 传值参数中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010#includeint add(int,int);void main()int a,b,c;cin a b;c=add(a,b);cout c=c endl;int add(int i,int j)i+;j+;return(i+j);abcij24243 35 5obj return(i+j);/例例3-5 值参传递值参传递3+51 1 1 1值传递机制值传递机制值传递机制值传递机制 3.2.1 传值参数中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010#includeint add(int,int);void main()int a,b,c;cin a b;c=add(a,b);cout c=c endl;int add(int i,int j)i+;j+;return(i+j);abcij24243 35 5obj8 return(i+j);/例例3-5 值参传递值参传递1 1 1 1值传递机制值传递机制值传递机制值传递机制 3.2.1 传值参数中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010#includeint add(int,int);void main()int a,b,c;cin a b;c=add(a,b);cout c=c endl;int add(int i,int j)i+;j+;return(i+j);abcij248243 35 5 c=add(a,b);/例例3-5 值参传递值参传递obj81 1 1 1值传递机制值传递机制值传递机制值传递机制 3.2.1 传值参数中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010#includeint add(int,int);void main()int a,b,c;cin a b;c=add(a,b);cout c=c endl;int add(int i,int j)i+;j+;return(i+j);abc248 c=add(a,b);/例例3-5 值参传递值参传递1 1 1 1值传递机制值传递机制值传递机制值传递机制 3.2.1 传值参数中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010#includeint add(int,int);void main()int a,b,c;cin a b;c=add(a,b);cout c=c endl;int add(int i,int j)i+;j+;return(i+j);abc248输出c=8 cout c=c endl;/例例3-5 值参传递值参传递1 1 1 1值传递机制值传递机制值传递机制值传递机制 3.2.1 传值参数中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20102 2 2 2实际参数求值的副作用实际参数求值的副作用实际参数求值的副作用实际参数求值的副作用 C+没有规定在函数调用时实际参数的求值顺序若实际参数表达式之间有求值关联,同一个程序在不同编译器可能产生不同的运行结果3.2.1 传值参数中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20102 2 2 2实际参数求值的副作用实际参数求值的副作用实际参数求值的副作用实际参数求值的副作用#includeintadd(intx,inty)returnx+y;voidmain()intx=4,y=6;intz=add(+x+x,x+yx+y);cout5+11=z?!n;从右向左计算实参表从右向左计算实参表从右向左计算实参表从右向左计算实参表xyz46xy10 x+yx+y3.2.1 传值参数中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20102 2 2 2实际参数求值的副作用实际参数求值的副作用实际参数求值的副作用实际参数求值的副作用 46xyz从右向左计算实参表从右向左计算实参表从右向左计算实参表从右向左计算实参表56xy10+x+x5#includeintadd(intx,inty)returnx+y;voidmain()intx=4,y=6;intz=add(+x+x,x+yx+y);cout5+11=z?!n;3.2.1 传值参数中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20102 2 2 2实际参数求值的副作用实际参数求值的副作用实际参数求值的副作用实际参数求值的副作用#includeintadd(intx,inty)returnx+y;voidmain()intx=4,y=6;intz=add(+x+x,x+yx+y);cout5+11=z?!n;从右向左计算实参表从右向左计算实参表从右向左计算实参表从右向左计算实参表xyz565xy10obj5+103.2.1 传值参数中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20102 2 2 2实际参数求值的副作用实际参数求值的副作用实际参数求值的副作用实际参数求值的副作用#includeintadd(intx,inty)returnx+y;voidmain()intx=4,y=6;intz=add(+x+x,x+yx+y);cout5+11=z?!n;从右向左计算实参表从右向左计算实参表从右向左计算实参表从右向左计算实参表xyz565xy105+10obj153.2.1 传值参数中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20102 2 2 2实际参数求值的副作用实际参数求值的副作用实际参数求值的副作用实际参数求值的副作用#includeintadd(intx,inty)returnx+y;voidmain()intx=4,y=6;intz=add(+x+x,x+yx+y);cout5+11=z?!n;从右向左计算实参表从右向左计算实参表从右向左计算实参表从右向左计算实参表xyz565xy101515obj153.2.1 传值参数中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20102 2 2 2实际参数求值的副作用实际参数求值的副作用实际参数求值的副作用实际参数求值的副作用#includeintadd(intx,inty)returnx+y;voidmain()intx=4,y=6;intz=add(+x+x,x+yx+y);cout5+11=z?!n;1515xyz563.2.1 传值参数中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20102 2 2 2实际参数求值的副作用实际参数求值的副作用实际参数求值的副作用实际参数求值的副作用#includeintadd(intx,inty)returnx+y;voidmain()intx=4,y=6;intz=add(+x+x,x+yx+y);cout5+11=z?!n;修改程序修改程序修改程序修改程序 +x;+x;intz=add(x x,x+y);cout5+11=zn;3.2.1 传值参数中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 20103 3 3 3默认参数默认参数默认参数默认参数 C+允许指定传值参数的默认值。当函数调用中省略默认参数时,默认值自动传递给被调用函数默认参数在函数原型定义默认参数放在一般参数之后3.2.1 传值参数中山大学地球科学系中山大学地球科学系 黄康有黄康有 2010 2010/例例3-7 使用默认参数使用默认参数#includedoublepower(doublereal,intn=2);voidmain()doubler=3.0;coutpower(r)endl;coutpower(r,3)endl;doublepower(doublereal,intn)if(n=0)retur