编译预处理与位运算.ppt_第1页
编译预处理与位运算.ppt_第2页
编译预处理与位运算.ppt_第3页
编译预处理与位运算.ppt_第4页
编译预处理与位运算.ppt_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

第十章 编译预处理与位运算,【教学要求】 1了解预编译的概念,掌握宏定义的方法。 2了解“文件包含”与预处理的应用。 3了解条件编译的几种形式。 4掌握各种位运算符,运算规则和优先级。 5了解位运算的实际应用。 6了解位段的定义和应用。,第十章 编译预处理与位运算,教学要点 编译预处理 宏定义 文件包含 条件编译 位运算 位段 应用举例,编译预处理,一、含义: 编译预处理是C编译系统的一个组成部分。 二、目的: 将预处理的结果和源程序一起再进行通常的编译处理,以得到目标代码。 三、实现方法: 通过使用几种特殊的命令,在进行程序的编译之前,先对这些特殊命令进行处理。 四、主要内容: 1.宏定义; 2.文件包含; 3.条件编译.,宏定义,一、不带参数的宏定义: 1、含义:用一个指定的标识符来表示一个字符串。 2、格式: #define 标识符 字符串 其中:“标识符”被称为宏。 3、作用:使用户能以一个简单的名字代替一个长的字符串。 4、实现:在预编译时将宏名替换成字符串(宏展开)。 如:#define PI 3.14159 在程序中将标识符PI代替为“3.1415”这个字符串。 5、应用举例: 6、使用要点:,例exp10_1:分析下列的程序: #define PI 3.1415 main() float i,s,r,v; printf(“input radius:”); scanf(“%f”, ,1.宏名一般都用大写字母表示,以区别于变量; 2.宏定义只是用宏名替代一个字符串,减少了在程序中书写某些字符串的工作量,只是一个简单的代替,不作语法检查; 3.宏定义不是语句,不必再其后加上“;”; 4.#define命令出现在函数的外面,它的有效范围是定义之后到本源文件的结束; 5.可以使用#undef命令终止宏定义的有效范围; 6.在宏定义中可以进行多层的替代. #definre R 3.0 #define PI 3.1415 #define L 2*PI*R #define S PI*R*R main() printf(“L=%fnS=%fn”,L,S);,例exp10_2:分析程序写出结果. #define PI 3.1415 #define S(r) PI*r*r main() float a,area; a=3.6; area=S(a); printf(“r=%fnarea=%fn”,a,area); ,1.对于带参数的宏的展开依就是用实际参数代替宏定义时的形式参数;请注意与函数的调用存在差别。 2.在宏定义时,宏名与带参数的括号之间不应加空格,不然的话,空格也作为字符的组成部分; 3.在宏代换时,不应人为地加上括号. 例exp10_3:分析程序写出结果. #define M 3 #define N M+2 #define S(N) N*N*N main() printf(“%dn”,S(N); 运行结果为:17,文件包含,1、含义: 将一个源文件的内容完全包含在另一个文件之中. 2、一般形式:#include “文件名”(或) file1.c file2.c file1.c 3、功能:可以节省程序设计人员的重复劳动。 4、应用举例: 5、使用要点:,例exp10_3:分析程序写出结果: file.h #define PR printf #define NL n #define D “%d” #define D1 D NL #define D2 D D NL #define D3 D D D NL #define D4 D D D D NL #define S “%s”,file.c #include “file.h” main() int a,b,c,d; char str=“CHINA”; a=1,b=2,c=3,d=4; PR(D1,a); PR(D2,a,b); PR(D3,a,b,c); PR(D4,a,b,c,d); PR(S,str); ,1、一个#include命令只能指定一个被包含的文件,若要包含n个文件,应使用n个#include命令; 2、若文件1包含文件2,而文件2中要用到文件3的内容,则可在文件1中用2个#include命令分别包含文件2和文件3,而且文件3应出现在文件2之前,如下表示: file1.c #include “file3.h” #include “file2.h” . 3、文件包含可以嵌套。 4、“”与在#include中的不同: 使用“”时,系统若在源程序文件目录中找不到被包含的文件,则将按系统指定的标准方式检索其他目录; 使用时,系统只按指定的标准方式检索其他目录; 5、预编译后的包含文件和源程序文件成为一个文件,所有的extern变量将成为源程序文件中的全局静态变量。,条件编译,一、引入条件编译的原因: 只对源程序中满足条件的部分内容进行编译。 可以减少被编译的语句,从而减少目标程序的长度。 二、定义形式: 方式1: #ifdef 标识符 程序段1 #else 程序段2 #endif 三、举例:,方式2: #ifndef 标识符 程序段1 #else 程序段2 #endif,方式3: #ifdef 表达式 程序段1 #else 程序段2 #endif,例exp10_4:分析程序写出结果: #define LETTER 1 main() char str20=“C Language”,c; int i=0; while(c=stri!=0) i+; #if LETTER if(c=a ,位运算,1、位运算符的含义 位运算是指进行二进制位的运算。 2、功能: c语言提供对内存单元的二进制位的操作,使得c语言能够编写系统软件. 3、位运算符 &: 按位与 |: 按位或 : 按位异或 : 取反 : 右移 (请区分逻辑移动与物理移动的用法) 4、使用要点: 5、应用:,要点: 1.位运算除以外,均为二目运算; 2.运算对象只能为整型或字符型数据. 3、各个位运算符号的使用: 1.按位与运算 (1) 清零,如果要将某个存储单元清零,则找到一个数,它的补码中的各位的值,与原来存储单元的各位的值的与运算的结果为0,则这两个数的与的结果为0,这样就可以达到使原来的单元清零的目的. 如: 00110110 & 11001001 00000000,(2).得到一个数中的某一位或某几位,只要找到一个数使得这个数某些位为1而某些位为0,需要得到的位上置1,其他位置0即可. 如: 1011010 & 0001110 0001010 2.按位或运算 要是某个数的某个固定位上为1,就可使用或运算来实现. 如: 10001101 00001111 10001111 3.异或运算规则: 参加运算的两个位,同号则结果为0,异号则结果为1.,例exp10_5:将一个数a从右边数的第47取出. 步骤: 1. 先使被取出的几位,右移成为最低位. 2.求出一个数它的最后4位均为1,其余均为0. 3.将步骤1和步骤2得到的数进行与运算. main() unsigned a, b,c d; scanf(“%o”, ,位段,位段的概念 位段的引用 使用位段的要点,位段的概念,1.位段的含义 位段是以位为单位定义长度的结构体类型中的成员. 2、位段的构成 例如:struct pack unsigned a:2; unsigned b:6; unsigned c:8; int x; data; 这个结构体类型的变量在内存中的情况为:,也可以使各个字段不恰好占满一个字节 struct pack unsigned a:2; unsigned b:6; unsigned c:4; int x; data; 则内存中的分配形式为: 此处:a,b,c共占2个字节中的12位,空闲4位, int型的x从一个新的字节开始.,对位段中数据的引用方法,1、方法:通过结构体成员来应用: 如: data.a=2; data.b=6; 2、要点: 注意每个字段的最大取值范围. 如:data.a的取值只能是:03, 因为两位二进制最大表示的数为3.,1.若某个位段要从新的存储单元开始,可以这样定义: struct pack unsigned a:2; unsigned :0; unsigned b:4; unsigned c:4; int x; data; 注意:长度为0的位段的作用是使下一个位段的内容从新的存储单元开始存放。,位段的使用要点,位段的使用要点,2.一个位段存储在同一个机器字中,不能跨字存储.如下面的定义是错误的(假设机器的字长为16位) struct pack unsigned a:2; unsigned b:5; unsigned c:10; unsigned d:4; int x; data;,3.可以定义无名字段 struct pack unsigned a:2; unsigned :5;/*空闲不用*/ unsigned b:2; unsigned c:4; int x; data;,位段的使用要点,4.位段可以用十进制的整型形式输出,也可以用其他的整型格式输出(如八进制,十六进制和无符号),位段以整型的形式参加算术运算. 分析下面的程序: main() struct pack unsigned a:2; unsigned b:3; unsigned c:1; unsigned d:4; unsigned e:3; unionstruct pack qp; unsigned i;abc; abc.i=255; printf(“%dn”,abc.qp.d);,位段的使用要点,例:分析下列程序的输出结果 #define N 2 #define CUBE(X) (X * X * X) #includestdio.h main() int iN2; iCUBE(i); printf(“dn“,i); 运行结果为:64,例:下列程序的输出结果是什么? #include stdio.h main() struct equip unsigned a:2; unsigned b:3; unsigned c:1; unsigned d:4; unsigned e:3; unsigned :3; union struct equip eq; unsigned i;abc; abc.i255; printf(“dn“,abc.

温馨提示

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

评论

0/150

提交评论