对C语言的深入讨论.ppt_第1页
对C语言的深入讨论.ppt_第2页
对C语言的深入讨论.ppt_第3页
对C语言的深入讨论.ppt_第4页
对C语言的深入讨论.ppt_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

函数的递归调用 在函数调用过程中 函数直接或间接调用了自己 我们把这种调用称作函数的递归调用 函数直接调用了自己 称作直接调用 函数间接的调用了自己 称作间接调用 在这里只讨论简单的直接递归 使用递归调用的3个条件 1 可以把要解决的问题转化为一个新的问题 而这个新的问题的解决方法仍与原来的解法相同 只是处理的对象有规律地递增或递减 2 可以应用这个转化过程使问题得到解决 3 必须有一个明确的结束递归的条件 例13 3以下程序运行后的输出结果是 fun intx if x 2 0 fun x 2 printf d x main fun 6 33 有以下程序 includeintf intt intn main inta 4 1 2 3 4 s s f a 4 printf d n s intf intt intn if n 0 returnt n 1 f t n 1 elsereturn0 程序运行后的输出结果是BA 4B 10C 14D 6 15 有以下程序 includefun intx if x 2 0 fun x 2 printf d x main fun 6 printf n 程序运行后的输出结果是 15 32 设有如下函数定义intfun intk if k 1 return0 elseif k 1 return1 elsereturnfun k 1 1 若执行调用语句 n fun 3 则函数fun总共被调用的次数是A 2B 3C 4D 5 编译预处理 一 宏1 不带参数的宏定义形式如下 define宏名替换文本或 define宏名例13 4 definePI3 1415926 1 宏名一般习惯用大写字母表示 以便与变量名相区别 这只是建议 宏名也可以使用小写字母 2 宏定义行的替换文本中还可以包含已经定义过的宏名 如 例13 5 definePI3 1415926 defineADDPI PI 1 defineTWO ADDPI 2 ADDPI 3 在宏展开时 C语言仅仅使用替换文本替换宏名 而不是使用计算的结果进行替换 4 宏定义时 如一行写不下 可以在行末尾加反斜线 然后在第二行接着再写 5 同一宏名不能重复定义 除非两个宏定义命令行完全一致 6 宏展开时 不能替换双引号中与宏名相同的字符串 7 宏定义的有效范围为定义点到文件结束 还可以用 undef提前终止已经定义的宏 2 带参数的宏 带参数的宏 即宏名后带有参数列表的宏定义为一个带参数的宏 在进行宏展开时 用表达式替换该宏名 同时用实参代替宏名后的形参 例13 6 defineMAX x y x y x y max MAX 10 5 宏展开后 赋值语句为 max 10 5 10 5 对带形参的宏定义 说明如下 1 在替换带参数的宏名时 一对圆括号不能少 圆括号中实参的个数应该与形参的个数相同 如有多个参数 各参数用逗号隔开 2 与不带参数的宏相同 同一个宏名不能重复定义 除非两个宏定义命令行完全一致 3 在宏替换行的表达式中的形参和整个表达式应该用括号括起来 例13 7 defineMUL a b a b m MUL 10 5 5 1 2 结果输出m 答案 15 35 以下程序 include defineSUB a a a main inta 2 b 3 c 5 d d SUB a b c printf d n d 程序运行后的结果是A 0B 12C 20D 10 35 有以下程序 include defineS x 4 x x 1main intk 5 j 2 printf d n S k j 程序运行后的输出结果是A 197B 143C 33D 28 35 有以下程序 include definef x x x xmain inta 3 s t s f a 1 t f a 1 printf d d n s t 程序运行后的输出结果是A 10 64B 10 10C 64 10D 64 64 36 有以下程序 include definePT3 5 defineS x PT x x mian inta 1 b 2 printf 4 1f n S a b 程序运行后输出的结果是A 14 0B 31 5C 7 5D 程序有错无输出结果 13 3标识符的作用域 一 存储分类根据变量在内存的不同位置 可以将变量分为两类 自动类和静态类 根据程序中变量定义的位置不同 又可以将变量分为局部变量和全局变量 在函数外部定义的变量是全局变量 局部变量是内部变量 全局变量也称为外部变量 局部变量可以是自动类变量 也可以是静态类变量 全局变量只能是静态类变量 C语言提供了与此相关的4个关键字 auto 自动 register 寄存器 static 静态 extern 外部 如 intsum autointa b c registerinti staticfloatx y 二 局部变量 局部变量有3种类型 auto register和static 1 auto变量在定义变量时 如果没有指定相应的存储类型 则系统默认该存储类型为auto类型 当程序进入定义该变量的函数或复合语句时 系统为这些变量临时分配内存单元 当程序离开这个函数或复合语句时 系统将销毁这些内存单元 使其数据不再有效 例13 9以下程序的输出结果是 main inti 1 i sum floatf f sum inti i 10 printf 1 i d n i printf 2 i d n i 答案 1 i 10 2 i 1 2 register变量 register变量 寄存器变量 与auto变量一样 是自动类变量 其作用域和生存期与auto变量完全一样 register变量与auto变量唯一的区别是auto变量在内存中分配存储空间 而register变量在CPU的寄存器中分配 寄存器运算速度非常的快 但寄存器数量有限 一般情况下 不建议编程人员使用寄存器变量 3 static变量 在函数内部或复合函数语句中定义变量时 如果使用static来说明 就构成了静态局部变量 静态局部变量的作用域与auto和register类型变量一样 但其生存期却完全不一样 静态局部变量在内存的静态存储区占据着永久性的存储单元 即使离开定义该变量的函数 或复合语句 该存储单元也不会被销毁 当下次再进行定义该变量的函数 或复合语句 时 存储单元仍然保存着原来的值 例13 10以下程序运行后的输出结果是 fun inta intb 0 staticintc 3 b c return a b c main inti a 5 for i 0 i 3 i printf d d i fun a printf n 答案 010111212 全局变量 外部变量定义 在函数外定义 可为本文件所有函数共用有效范围 从定义变量的位置开始到本文件结束 以及有extern说明的其它文件外部变量可用存储类型 缺省或static 在外部任意位置定义的变量 称为全局变量 全局变量都是静态变量 其作用域从定义的位置开始 到整个源文件结束为止 例13 11以下程序的运行结果是 intsum intfun1 sum 20 inta intfun2 a 20 sum a main sum 0 fun1 a 8 fun2 printf sum da d sum a 答案 sum 40a 20 34 有以下程序 includeintfun staticintx 1 x 2 returnx main intI s 1 for i 1 i 2 i s fun printf d n s 程序运行后的输出结果是A 0B 1C 4D 8 34 设函数中有整型变量n 为保证其在未赋值的情况下初值为0 应选择的存储类别是A autoB registerC staticD auto或register 34 有以下程序 includeintf intn main inta 3 s s f a s s f a printf d n s intf intn staticinta 1 n a returnn 程序运行以后的输出结果是A 7B 8C 9D 10 34 有以下程序 includeintfun staticintx 1 x 2 returnx main inti s 1 for i 1 i 3 i s fun printf d n s 程序运行后的输出结果是A 0B 10C 30D 64 13 4动态存储分配 一 malloc函数malloc函数用于分配内存空间 ANSIC标准规定malloc函数返回值的类型为void 该函数的调用形式为 malloc size 其中参数size的类型为unsignedint 表示需要分配的内存的字节数 如果系统有足够的内存可供分配 函数返回一个指向有size个字节的存储区首地址 该首地址的基类型为void类型 若没有足够的内存单元可供分配 函数返回空值 NULL 例13 12malloc函数的应用int p float q p int malloc 4 q float malloc 4 if p NULL p 6 If q NULL q 3 8 动态分配存储单元 p 6 q 3 8 动态分配得到的内存单元没有名字 只能通过指针变量来引用它 一旦指针变量的值发生改变 原存储单元及所存数据都将无法再引用 通过调用malloc函数所分配的动态存储单元中没有确定的初值 在调用malloc进行存储分配时 如果不能确定数据类型所占字节数 可以调用sizeof运算符来求得 如上例可以改为 p int malloc sizeof int q float malloc sizeof float 这是一种常用的方式 它由系统来计算数据类型的字节数 二 free函数 通过静态存储分配的变量和数组 在生存期后 或者程序运行结束后 所占用的存储单元会由系统自动释放 但是 动态存储分配的内存单元 必须由程序员手动进行释放 如果没有对其进行释放 则内存单元会一致被占用 从而无法被系统重新分配 我们可以使用free函数释放动态分配的内存单元 free函数的调用形式如下 free p 这里指针p必须指向由动态分配函数 如malloc 分配的地址 free函数将指针p所指向的空间释放 使部分空间可以由系统重新支配 此函数没有返回值 三 calloc函数 通常情况下 malloc函数用于分配单个数据类型的存储单元 但是有时候根据需求可能要分配多个同一类型的连续的存储空间 ANSIC提供了calloc用于此功能的实现 calloc函数的返回值是基类型为void的指针 calloc函数的调用形式 calloc n size 其中参数n和size的类型都是unsignedint calloc函数用来给n个同一类型的数据项分配连续的存储空间 其中每个数据项的长度为size个字节 若分配成功 函数返回存储空间的首地址 否则返回空值 由calloc函数分配的存储单元 系统自动置初值为0 例13 13int pint pint int calloc 10 sizeof int free pint 程序调用calloc函数在内存中分配了10个连续的int类型的存储空间 由pint指向存储单元的首地址 每个存储单元可以存放一个int型数据 通过free函数释放动态分配的存储空间 14 以下程序运行后的输出结果是 14 include include includemain char p inti p char malloc sizeof char 20 strcpy p welcome for i 6 i 0 i putchar p i printf n free p 31 有以下程序 include includeintfun intn int p p int malloc sizeof int p n return p main inta a fun 10 printf d n a fun 10 程序的运行结果是A 0B 10C 20D 出错 17 以下程序的输出结果是 include includemain char s1 s2 m s1 s2 char malloc sizeof char s1 15 s2 20 m s1 s2 printf d n m 位运算符和位运算 运算符含义 按位与 按位或 按位异或 取反 右移 位运算赋值运算符 2相当于a a 2 按位与 参加运算的两个运算量 如果两个相应的位都为1 则该位的结果值为1 否则为0 0 0 00 1 01 0 01 1 1例如 3 5 3 5 按位或 两个相应位只要有一个为1 该位的结果值为1 0 0 01 0 10 1 11 1 1例如 060 017 异或 参加运算的两个相应位同号 结果为0 假 异号为1 真 0 0 01 0 10 1 11 1 0 取反 此运算符是一个单目 元 运算符 对一个二进制数按位取反 左移运算符 将一个数的各二进制位全部左移若干位 必须为整数 高位左移后溢出 舍弃不起作用 比如 a a 2 如a 1500001111 左移2位后00111100a 60 左移中低位补0

温馨提示

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

最新文档

评论

0/150

提交评论