- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C课件--编译预处理第12讲
第十章 编译预处理与位运算 10.1 编译预处理的概念 编译预处理:对源程序进行正式编译之前的处理。 以“#“开头的命令是预处理命令,它不是C本身的组成部分,不能直接对它进行编译,先对程序中这些特殊的命令进行”预处理“,再由编译程序对预处理后的源程序进行通常的编译处理,得到可执行文件。 对一个源程序进行编译时,系统自动引用预处理程序对源程序中的预处理部作处理,然后自动进入源程序的编译。 三种预处理功能:宏定义、文件包含、条件编译 10.2 宏定义 C语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。 1.不带参数的宏定义 #define PI 3.14159 说明:(1)宏名一般用大写字母表示。 (2)宏定义用宏名代替一个字符串,作简单置换,不作正确性检查。 (3)宏定义不是C语句,不必在行末加分号,如果加了,则会连分号一起进行置换。 (4)宏定义必须写在函数之外,宏名的有效范围是从宏定义开始到本源程序文件结束,或遇到预处理命令#undef时止。 (5)宏定义不但可以定义常量,还可以定义C语句和表达式。 #define M (y*y+3*y) 10.2 宏定义 (6)宏定义允许嵌套。 #define PI 3.14 #define R 30 #define AREA PI*R*R void main() { printf(“%lf\n”,AREA); } 10.2 宏定义 2.带参宏定义 对带参宏,在调用中不仅要将宏展开,而且要用实参去代换形参。 #define 宏名(形参表列) 字符串 #define M(a,b) a*b …… s=M(3,5); …… 10.2 宏定义 说明:(1)带参宏定义中,宏名和形参表之间不能有空格出现。 (2)宏调用改为s=M(3+2,5+1)时,调用结果为s=3+2*5+1,应将宏定义改为 #define M(a,b) (a)*(b) 注意宏定义圆括号的使用。 (3)宏定义中由双引号括起来的字符串常量,在宏替换时实参不会对此作替换,如果想作替换,可在形参前加“#”。 #define ADD(m) printf(“#m=%d\n”,m) (4)宏定义包含”##”,替换时会将”##”去掉。 #define S(a,b) a##b 调用S(define,5);语句时,宏展开为define5。 10.3 文件包含 文件包含是指将一个源文件的内容全部包含到另一个源文件中,成为其一部分。 一般形式: #include 文件名 #include “文件名” 10.4 条件编译 可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件,对于程序的移植和调试很有用。 三种形式: 1.#ifdef 标识符 程序段1 [#else 程序段2] #endif 含义:若标识符已被#define命令定义过,则编译程序段1,否则编译程序段2。 10.4 条件编译 2. #ifndef 标识符 程序段1 [#else 程序段2] #endif 含义:若标识符#define命令未定义过,则编译程序段1,否则编译程序段2。 10.4 条件编译 3. #if 表达式 程序段1 [#else 程序段2] #endif 含义:若表达式(常量表达式)的值为真,则编译程序段1,否则编译程序段2。 10.4 条件编译 例 #includestdio.h void main() { float r=5.5,s; #if defined(PI) s=PI*r*r; #else #define PI 3.14159 s=PI*r*r; #endif printf(s=%f\n,s); } 11.1 位运算符 11.2 位运算符的功能 1.位逻辑运算符 (1)位与运算符() 程序中通常使用它将变量的某些位清零。 例 95=1 (2)位或运算(|) (3)异或运算(^) 0^0=0 1^1=0 1^0=1 0^1=1 (4)取反运算(~) ~1=0 ~0=1 11.2 位运算符的功能 2.移位运算符 (1)左移位运算符() 高位左移溢出,舍弃不用。 例 a=3 a4 结二进制)=48 (2)右移位运算符() 对于无符号数,右移时,高位补0,对于有符号数,正数在右移时,最高位自动补0,负数在右移时,最高位(符号位)补0还是补1,取决编译系统,补0时,称为“逻辑右移”,补1时,称为“算术右移”。
文档评论(0)