C(麦中凡版)课件第4章.ppt

上传人:max****ui 文档编号:3402643 上传时间:2019-12-13 格式:PPT 页数:38 大小:1.02MB
返回 下载 相关 举报
C(麦中凡版)课件第4章.ppt_第1页
第1页 / 共38页
C(麦中凡版)课件第4章.ppt_第2页
第2页 / 共38页
C(麦中凡版)课件第4章.ppt_第3页
第3页 / 共38页
点击查看更多>>
资源描述
C+语言程序设计,-第4章流程控制、函数和文件,第4章流程控制、函数和文件,本章学习要点,C+的流程控制语句作用域的理解C+中的函数函数的声明和定义函数的参数和参数传递函数重载,4.1流程控制语句,条件语句if-else;switch循环语句while;for跳转语句break;continue;return;goto.,4.2函数和文件,C+中,函数的作用:按功能将复杂的大任务划分为小任务;在类中,用函数来定义方法(method)。C+中的文件:一个文件用于存放多个函数;一个完整的程序可包含多个文件;文件是编译单位,当其内容改变时,只需单独编译该文件,然后与其他文件链接生成.exe。,4.2.1作用域,在程序中,标识符不一定是全局可用的,它特定于程序中某一范围,这种范围就叫此标识符的作用域。C+中,标识符的作用域有四种:块:程序中用花括号包括的若干语句;函数:函数内声明的变量;文件:在函数外声明的静态全局变量;全局:全局名。标识符的作用域从声明处开始。,4.2.1作用域,intx;/全局xvoidf1()intx;/局部x,它隐藏了全局xx=1;/给局部变量x赋值intx;/它隐藏了第一个局部变量xx=2;/给第二个局部x赋值x=3;/给第一个局部x赋值int*p=/取全局x的地址,4.2.1作用域,intx;/全局xvoidf2()intx;/隐藏全局x:x=2;/给全局x赋值,外层作用域不能访问内层作用域;利用:可访问当前作用域所隐藏的全局名,但不能访问隐藏的局部名。,4.2.1作用域,intx=11;/全局xvoidf3()inty=x;/变量y用全局x初始化intx=22;/局部xy=x;/y=?,同一作用域内,单个名字引用两个不同的对象,因为名字的作用域总是始于声明点。C+认为:函数的参数名在函数作用域中声明。,4.2.2存储分类符,存储分类符用来告诉编译程序如何存储变量。变量定义的一般形式为:存储分类符类型变量名C+中有4个存储分类符:extern(外部的)static(静态的)register(寄存器的)auto(自动的),4.2.2存储分类符,extern变量多个文件共享一个变量时,在单独编译单个文件时,将此信息通知编译器,以免编译器为每个文件的全局变量都分配存储区。例:main()externA,B;/外部变量声明coutmax(A,B)endl;intA=13,B=-8;/定义外部变量,4.2.2存储分类符,static变量staticintc=3;声明局部变量和外部变量。在编译时赋初值,函数调用结束后仍然存在,但其他函数不能引用。在需要保留函数上一次调用结束时的值时,应使用静态局部变量。E.g.打印1到5的阶乘值。,4.2.2存储分类符,E.g.打印1到5的阶乘值。intfac(intn)staticintf=1;f=f*n;return(f);main()inti;for(i=1;i=5;i+)couti“!=”fac(i)endl;,4.2.2存储分类符,register变量为了提高执行效率,局部变量的值被放在CPU的寄存器中。registerinti;auto变量autointb,c=3;intb,c=3;动态地分配存储空间,函数执行后,自动释放其所占的存储单元。,4.2.3函数的参数传递,在C中,函数的参数传递有以下两种情况:,值传递:,将变量名作为形参和实参,此时传递给形参的是实参变量的值,数据传递是单向的,在函数执行期间形参值发生变化并不回传给实参。,地址传递:,形参是指针变量,实参是变量的地址。函数调用时,形参指向实参变量单元,数据传递是双向的。,【例4-1】编写一个函数,交换两个整型变量的值。,值传递:,4.2.3函数的参数传递,地址传递:传递变量的地址(指针),【例4-1】编写一个函数,交换两个整型变量的值。,4.2.3函数的参数传递,引用传递:,【例4-1】编写一个函数,交换两个整型变量的值。,4.2.3函数的参数传递,#includevoidswap(int,4.2.3函数的参数传递,函数默认参数在多次调用一个函数将实参传递给形参时,其中可能有一个或几个参数,它们传递进来的实参值多次相同;在定义或声明函数时,给形参一个默认值,如果在调用时没有给该形参传递实参值,则使用默认值作为该形参的值;如果调用时给该形参传递了实参值,则使用实参的值作为该形参的值。例:voidf1(inta,intb=-1);调用时,可采用f1(1,2);或f1(2);/形参b为缺省值-1.,4.2.4函数参数,一旦为某给定参数定义了缺省值,必须为后继参数也定义缺省值(直到最后所有参数)。例:voidf2(inta,intb=-1,intc);/False!voidf2(inta,intc,intb=-1);在调用一个函数时,如果缺省了某个参数,则直到最右端的参数都要省去。例:声明:voidf3(inta,intb=-1,intc=1);调用形式:f3(1,12);/False!,4.2.4函数参数,注意,在函数声明时,有无参数名都可以;而在函数定义时,若不指明参数名字,则可定义不使用的参数。例:voidf4(int*a,int*b,int*)/不使用第三个参数,4.2.4函数参数,注意,【例4-2】求两个或三个正整数中的最大值,使用带有默认参数的函数实现。#includeintmain()intmax(int,int,int=0);/带有默认参数的函数原型声明inta=5,b=8,c=10;coutmaxofaandbis:max(a,b)endl;coutmaxofa,bandcis:max(a,b,c)endl;return0;,/定义带有默认参数的函数intmax(inta,intb,intc=0)if(ab)a=b;if(ac)a=c;returna;,4.2.4函数参数,C+中的主函数有两种形式:intmain()/*/intmain(intargc,char*argv)/*/,4.2.4函数参数,复习:C提供的预处理功能有三种:文件包含:#include宏定义:#define字符串1字符串2(带参宏)条件编译:#if条件源程序部分1#else源程序部分2#endif,4.3内联、重载和引用,C+中,用const变量和内联函数实现宏定义的功能。,C+提供的宏定义功能:#defineYES1constintYES=1;用内联函数替代带参宏:例:用带参宏定义实现求平方值。,4.3.1宏和内联,#includeinlineintpower(intx)returnx*x;intmain()coutpower(2)endl;coutpower(1+1)endl;return0;,#include#definepower(x)x*xintmain()coutpower(2)endl;coutpower(1+1)endl;return0;,内联函数与宏的比较:宏定义是在编译前由预处理程序对其预处理,它只作简单的字符置换而不作语法检查,往往会出现意想不到的错误。调用内联函数时由编译器处理,编译器在所有调用该内联函数的地方将其实际的函数代码装上。内联函数调用时,编译器要检查传递过来的参数类型;若传入的是表达式,其只求值一次。,4.3.1宏和内联,【例4-3】将函数声明为内联函数。#includeintmain()intx=3,y=5;ints;inlineintadd(inta,intb);/内联函数原型s=add(x,y);/调用函数addcouts=sendl;return0;/定义内联函数addinlineintadd(inta,intb)returna+b;,inta,b;a=x;b=y;s=x+y;,4.3.1宏和内联,1.在声明内联函数时,可以在函数声明和函数定义的前面都写上关键字inline,也可以只在其中一处写上关键字inline,效果都是相同的。2.内联函数是一种“以空间换时间”的策略。3.对函数进行内联声明,只是程序员对编译系统的一个建议而非命令,并不一定只要声明为内联函数C+系统就一定会按内联函数去处理,系统会根据实际情况决定是否这样做。4.内联函数的机制适用于被调函数规模较小而又被频繁调用的情况。,注意,4.3.1宏和内联,问题:求2个数的和。(分别考虑整数、浮点数的情况),intadd_i(inta,intb)coutCallintegeraddfunction.endl;returna+b;floatadd_f(floata,floatb)coutCallfloataddfunction.endl;returna+b;,4.3.2重载函数,C+允许在同一作用域中用同一函数名定义多个函数;这些函数的参数个数,参数类型或参数类型次序上不相同,这些同名的函数用来实现同一类的操作。这就是函数的重载。函数重载,即对一个函数名重新赋予它新的操作,使一个函数名可以多用。,4.3.2重载函数,【例4-4】使用add为函数名定义整数的加法和两个浮点数的加法.intadd(inta,intb)/整数加法的add函数定义coutCallintegeraddfunction.endl;returna+b;floatadd(floata,floatb)/浮点数加法的add函数定义coutCallfloataddfunction.endl;returna+b;,4.3.2重载函数,【例4-5】使用add作为函数名定义两个整数的加法函数和三个整数的加法函数。intadd(inta,intb)returna+b;floatadd(floata,floatb,intc)returna+b+c;,4.3.2重载函数,函数重载需要函数参数的类型或个数必须至少有其中之一不同,函数返回值类型可以相同也可以不同。但是,不允许参数的个数和类型都相同而只有返回值类型不同。从语法上来说,可以让两个或多个完全不相干的函数使用相同的函数名,进行重载,但是这样做使得程序的可读性下降,不建议这样做。使用同名函数进行重载时,重载函数在功能上应该相近或属于同一类函数。,4.3.2重载函数,函数与引用联合使用主要有两种方式:函数的参数是引用当使用引用作为函数的形参时,引用不是一个单独的变量,不需要在内存中分配存储单元,实参向形参传递的是变量的名字。使用引用作为函数的形参可以部分代替指针,降低了程序的复杂度,提高了程序的执行效率,同时也提高了程序的可读性。函数的返回值是引用以引用作为函数的返回值是为了使函数可以作为左值而被赋值。函数的返回值为引用类型表示该函数的返回值是一个内存变量的别名。可以将函数调用作为一个变量来使用,可以为其赋值。,4.3.3函数、引用和常量,【例4-6】引用作为函数的返回值。intIndex=100;int,4.3.3函数、引用和常量,/此处Index=100,/此处Index=100,n=100,/此处Index=5,/此处Index=6,定义返回引用的函数时,注意不要返回对该函数内的自动变量或参数的引用。否则,因为自动变量的生存期仅局限于函数内部,当函数返回时,自动变量就消失了,函数就会返回一个无效的引用。一般来说,不会为常量分配空间。因此返回值为引用的函数不能返回常量。然而,当函数返回值声明为const类型的引用时,返回常量是合法的。,4.3.3函数、引用和常量,const与引用例:int/非法,4.3.3函数、引用和常量,constint,ThankYou!,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!