C(麦中凡版)课件第4章.ppt_第1页
C(麦中凡版)课件第4章.ppt_第2页
C(麦中凡版)课件第4章.ppt_第3页
C(麦中凡版)课件第4章.ppt_第4页
C(麦中凡版)课件第4章.ppt_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 作用域,int x; /全局x void f1( ) int x; /局部x,它隐藏了全局x x=1; /给局部变量x赋值 int x; /它隐藏了第一个局部变量x x=2; /给第二个局部x赋值 x=3; /给第一个局部x赋值 int *p= /取全局x的地址,4.2.1 作用域,int x; /全局x void f2( ) int x; /隐藏全局x :x=2; /给全局x赋值 ,外层作用域不能访问内层作用域; 利用:可访问当前作用域所隐藏的全局名,但不能访问隐藏的局部名。,4.2.1 作用域,int x=11; /全局x void f3( ) int y=x; /变量y用全局x初始化 int x=22; /局部x y=x; /y=? ,同一作用域内,单个名字引用两个不同的对象,因为名字的作用域总是始于声明点。 C+认为:函数的参数名在函数作用域中声明。,4.2.2 存储分类符,存储分类符用来告诉编译程序如何存储变量。 变量定义的一般形式为: 存储分类符 类型 变量名 C+中有4个存储分类符: extern(外部的) static(静态的) register(寄存器的) auto(自动的),4.2.2 存储分类符,extern变量 多个文件共享一个变量时,在单独编译单个文件时,将此信息通知编译器,以免编译器为每个文件的全局变量都分配存储区。 例: main() extern A,B; /外部变量声明 coutmax(A, B)endl; int A=13, B=-8; /定义外部变量,4.2.2 存储分类符,static变量 static int c=3; 声明局部变量和外部变量。 在编译时赋初值,函数调用结束后仍然存在,但其他函数不能引用。 在需要保留函数上一次调用结束时的值时,应使用静态局部变量。 E.g. 打印1到5的阶乘值。,4.2.2 存储分类符,E.g. 打印1到5的阶乘值。 int fac(int n) static int f=1; f=f*n; return(f); main() int i; for(i=1;i=5;i+) cout i“!=”fac(i)endl; ,4.2.2 存储分类符,register变量 为了提高执行效率,局部变量的值被放在CPU的寄存器中。 register int i; auto变量 auto int b, c=3; int b, c=3; 动态地分配存储空间,函数执行后,自动释放其所占的存储单元。,4.2.3 函数的参数传递,在C中,函数的参数传递有以下两种情况:,值传递:,将变量名作为形参和实参,此时传递给形参的是实参变量的值,数据传递是单向的,在函数执行期间形参值发生变化并不回传给实参。,地址传递:,形参是指针变量,实参是变量的地址。函数调用时,形参指向实参变量单元,数据传递是双向的。,【例4-1】编写一个函数,交换两个整型变量的值。,值传递:,4.2.3 函数的参数传递,地址传递:传递变量的地址(指针),【例4-1】编写一个函数,交换两个整型变量的值。,4.2.3 函数的参数传递,引用传递:,【例4-1】编写一个函数,交换两个整型变量的值。,4.2.3 函数的参数传递,#include void swap(int ,4.2.3 函数的参数传递,函数默认参数 在多次调用一个函数将实参传递给形参时,其中可能有一个或几个参数,它们传递进来的实参值多次相同; 在定义或声明函数时,给形参一个默认值,如果在调用时没有给该形参传递实参值,则使用默认值作为该形参的值;如果调用时给该形参传递了实参值,则使用实参的值作为该形参的值。 例:void f1(int a, int b=-1); 调用时,可采用 f1(1, 2); 或f1(2); /形参b为缺省值-1.,4.2.4 函数参数,一旦为某给定参数定义了缺省值,必须为后继参数也定义缺省值(直到最后所有参数)。 例:void f2(int a, int b=-1, int c); / False! void f2(int a, int c, int b=-1); 在调用一个函数时,如果缺省了某个参数,则直到最右端的参数都要省去。 例:声明:void f3(int a, int b=-1, int c=1); 调用形式:f3(1,12); / False!,4.2.4 函数参数,注意,在函数声明时,有无参数名都可以;而在函数定义时,若不指明参数名字,则可定义不使用的参数。 例:void f4(int *a, int * b, int *) /不使用第三个参数 ,4.2.4 函数参数,注意,【例4-2】求两个或三个正整数中的最大值,使用带有默认参数的函数实现。 #include int main() int max(int,int,int = 0);/带有默认参数的函数原型声明 int a = 5,b = 8,c = 10; cout“max of a and b is:“max(a,b)endl; cout“max of a, b and c is:“max(a,b,c)endl; return 0; ,/定义带有默认参数的函数 int max(int a, int b, int c = 0) if(a b) a = b; if(a c) a = c; return a; ,4.2.4 函数参数,C+中的主函数有两种形式: int main( ) /*/ int main(int argc, char * argv ) /*/ ,4.2.4 函数参数,复习: C提供的预处理功能有三种: 文件包含: #include 宏定义: #define 字符串1 字符串2(带参宏) 条件编译:#if 条件 源程序部分1 #else 源程序部分2 #endif,4.3 内联、重载和引用,C+中,用const变量和内联函数实现宏定义的功能。,C+提供的宏定义功能: #define YES 1 const int YES=1; 用内联函数替代带参宏: 例:用带参宏定义实现求平方值。,4.3.1 宏和内联,#include inline int power (int x) return x*x; int main() coutpower(2)endl; coutpower(1+1)endl; return 0; ,#include #define power(x) x*x int main() coutpower(2)endl; coutpower(1+1)endl; return 0; ,内联函数与宏的比较: 宏定义是在编译前由预处理程序对其预处理,它只作简单的字符置换而不作语法检查,往往会出现意想不到的错误。 调用内联函数时由编译器处理,编译器在所有调用该内联函数的地方将其实际的函数代码装上。 内联函数调用时,编译器要检查传递过来的参数类型;若传入的是表达式,其只求值一次。,4.3.1 宏和内联,【例4-3】将函数声明为内联函数。 #include int main() int x = 3, y = 5; int s; inline int add(int a, int b); /内联函数原型 s = add(x,y); /调用函数add cout“s = “sendl; return 0; /定义内联函数add inline int add(int a,int b) return a+b; , int a,b; a=x;b=y; s=x+y; ,4.3.1 宏和内联,1.在声明内联函数时,可以在函数声明和函数定义的前面都写上关键字inline,也可以只在其中一处写上关键字inline,效果都是相同的。 2.内联函数是一种“以空间换时间”的策略。 3.对函数进行内联声明,只是程序员对编译系统的一个建议而非命令,并不一定只要声明为内联函数C+系统就一定会按内联函数去处理,系统会根据实际情况决定是否这样做。 4.内联函数的机制适用于被调函数规模较小而又被频繁调用的情况。,注意,4.3.1 宏和内联,问题:求2个数的和。(分别考虑整数、浮点数的情况),int add_i(int a,int b) cout“Call integer add function. “endl; return a+b; float add_f(float a,float b) cout“Call float add function. “endl; return a + b; ,4.3.2 重载函数,C+允许在同一作用域中用同一函数名定义多个函数; 这些函数的参数个数,参数类型或参数类型次序上不相同,这些同名的函数用来实现同一类的操作。这就是函数的重载。 函数重载,即对一个函数名重新赋予它新的操作,使一个函数名可以多用。,4.3.2 重载函数,【例4-4】使用add为函数名定义整数的加法和两个浮点数的加法. int add(int a,int b) /整数加法的add函数定义 cout“Call integer add function. “endl; return a+b; float add(float a,float b) /浮点数加法的add函数定义 cout“Call float add function. “endl; return a + b; ,4.3.2 重载函数,【例4-5】使用add作为函数名定义两个整数的加法函数和三个整数的加法函数。 int add(int a,int b) return a+b; float add(float a,float b,int c) return a + b + c; ,4.3.2 重载函数,函数重载需要函数参数的类型或个数必须至少有其中之一不同,函数返回值类型可以相同也可以不同。但是,不允许参数的个数和类型都相同而只有返回值类型不同。从语法上来说,可以让两个或多个完全不相干的函数使用相同的函数名,进行重载,但是这样做使得程序的可读性下降,不建议这样做。使用同名函数进行重载时,重载函数在功能上应该相近或属于同一类函数。,4.3.2 重载函数,函数与引用联合使用主要有两种方式: 函数的参数是引用 当使用引用作为函数的形参时,引用不是一个单独的变量,不需要在内存中分配存储单元,实参向形参传递的是变量的名字。使用引用作为函数的形参可以部分代替指针,降低了程序的复杂度,提高了程序的执行效率,同时也提高了程序的可读性。 函数的返回值是引用 以引用作为函数的返回值是为了使函数可以作为左值而被赋值。函数的返回值为引用类型表示该函数的返回值是一个内存变量的别名。可以将函数调用作为一个变量来使用,可以为其赋值。,4.3.3 函数、引用和常量,【例4-6】引用作为函数的返回值。 int Index=100; int ,4.3.3 函数、引用和常量,/ 此处Index=100,/ 此处Index=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论