专题-预处理、位操作.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
专题-预处理、位操作

沈阳东软软件股份有限公司 IA事业部 (机密) 专题-预处理、位操作 课程主要内容 预处理 位操作 问题与习题 主要内容 1.1 宏定义 1.2 条件编译 1.3 文件包含 2.1 位操作 1.1 宏定义(1) 宏定义 普通宏 #define PI (3.1415926) 带参数的宏 #define max(a,b) ((a)(b)?(a),(b)) 取消定义 #undef MacroName 为什么要用宏定义 维护性:有时我们需要将某个特定数据(如某个数据表的大小)在程序中出现的所有实例统统加以修改,我们希望能够只做一个改动就达到目的 #define MAXSIZE 100 在函数调用的时候会带来重大的系统开销,因此我们有时希望有一个程序块,看上去像一个函数,但却没有函数调用的开销 #define max( a,b) (((a)=(b))?(a):(b)) 提高程序的易读性:文字比数字要容易理解多,一个好的宏名可以顾名思义。 1.1 宏定义(2) 宏定义的特点 宏定义值使用宏名代替一个字符串,不做语法检查 对程序中用双括号括起来的字符串内部的字符,即使与宏名相同,也不进行替换 函数调用和宏定义的区别 函数调用时,先求出实参表达式的值,然后代入形参。而使用带参数的宏只是进行简单的字符替换 对于函数调用,对实参要进行类型检查,如果实参与形参类型不一致,应进行类型转换,如果无法转换,编译时会出错。但是宏定义不会做类型检查 宏定义和类型定义的区别 宏定义不做语法检查,可以把任何字符串定义成类型 #define A integer /* integer不是一个合法的类型*/ 使用宏定义结果有时与预期的不同 #define T1 struct student* Typedef struct student *T2 ; T1 a, b; /*相当于 struct student* a, b, b不是结构体指针,与预期的不同*/ T2 a, b; 1.1 宏定义(3) 使用宏定义需要注意 不要忽视宏定义中的空格 #define f (x) (x) +1 // 实际上是把f 定义成了(x) (x)+1 对于不带参数的宏,若宏值多于一项,一定要使用括号 #define MAX (M+N) 要给每个参数加上括号,否则可能会影响计算的优先级 #define abs(x) (x=0)?x:-x z =abs(a+b); /*相当于 z= (a+b=0)?a+b:-a+b //修改后 #define abs(x) ((x)=0?(x): -(x) 尽量用typedef而不是宏定义去定义类型 1.2 条件编译 条件编译例子 #ifdef BMW #define SIZE 16 #else #define SIZE 32 #endif 条件编译指令 #ifdef …#else …#endif #ifndef …#else …#endif #if 1 …#else …#endif #if 0 …#else …#endif 条件编译的应用 解决头文件重复包含的问题 在调试时,用条件编译的方式将debug语句加入; 在修改Bug时候,用条件编译方式引入新的修正,并保留原来的程序; 1.3 文件包含 头文件包含 #include “xxxx.h” 含义是在编译时将头文件的内容加入到包含文件中。 头文件包含的方式 #include “xxxx.h” 到本级目录去找。 #include xxxx.h 到系统默认目录和本级目录去找。 重复包含(重复定义) 由于头文件包含可以嵌套,那么C文件就有可能包含多次同一个头文件,就可能出现重复定义的问题的 通过条件编译开关来避免重复包含(重复定义) 例如 #ifndef __headerfileXXX__ #define __headerfileXXX__ … 文件内容 … #endif 2.1位操作(1) 基本位操作符 , 如 (0x01) 4 =0x10; (0x80) 4 = 0x08 位操作应用举例 乘法、除法,例如a*8可以写成a3; 地址计算,例如一个32位的地址装在元素类型是char的数组a[4]中(假设按照从低到高存放),那么计算这个地址的方法为((a[3]24)|(a[2]16)|(a[1]8)|a[0] 容易出现的问题 尽量使用无符号变量,避免产生符号错误; 注意避免发生数据溢出; 2.1位操作(2) 位运算符例子分析 请分析下面问题的含义。 #typedef unsigned char? UINT1 #typedef unsigned short?UINT2 #ty

文档评论(0)

wujianz + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档