9-预处理和动态存储.ppt
《9-预处理和动态存储.ppt》由会员分享,可在线阅读,更多相关《9-预处理和动态存储.ppt(39页珍藏版)》请在三一文库上搜索。
1、专题之九 编译预处理和动态存储管理,西南石油大学计算机科学学院 主讲:张耀文,考纲分析,编译预处理 1、 宏定义:不带参数的宏定义;带参数的宏定义。 2、 “文件包含“处理。,分析:这部分主要讨论了预编译,一般会出1-2个选择题和1-2个填空题。 这部分好掌握,明确两条:1、宏定义#define后面的就直接带入,再计算。2、头文件中的ifndef/define/endif的作用是防止该头文件被重复引用。,C语言的预处理程序负责分析和处理以“#”为首字符的预处理控制行。预处理是在编译前进行的。,C提供的预处理功能主要有以下三种: 1. 宏定义 2. 文件包含 3. 条件编译 分别用宏定义命令、文
2、件包含命令、条件编译命令来实现。为了与一般C语句相区别,这些命令以符号“#”开头。,历年真题必学,真题1:下列程序的功能是:给r输入数据后计算半径为r的圆面积s。程序在编译时出错。【2005.9】 main() int r; float s; scanf(%d, 出错的原因是( )。 A)注释语句书写位置错误 B)存放圆半径的变量r不应该定义为整型 C)输出语句中格式描述符非法 D)计算因面积的赋值语句中使用了非法变量,真题2:下列4个程序中,完全正确的是( )。【2006.4】 A)#include B)#include main( ); main( ) /*programming*/ /*
3、/programming/*/ printf(programming! n); printf(programming! n); C)#include D)include main( ) main( ) /* / programming*/ */ /* programming*/ printf(programming! n); printf(programming! n);,真题3:以下叙述中错误的是( )。【2008.4】 A)在程序中凡是以“#”开始的语句行都是预处理命令行 B)预处理命令行的最后不能以分号表示结束 C)#define MAX是合法的宏定义命令行 D)C程序对预处理命令行的处
4、理是在程序执行的过程中进行的,1 宏定义(宏替换),1.1 不带参数的宏定义,简单的字符串替换 一般形式 #define 宏名 字符串 通常 “宏名(宏标识符)”用大写字母表示,用空格分开,末尾不带“;”, 以换行符结束。,define预处理命令不仅可以定义符号常量及字符串,而且也可以定义带参数的宏。,例 #define PI 3.1415926 main() float i,s,r,v; printf(“input raDiuS“); scanf(“%f“, ,(1) 宏名一般习惯用大写字母表示,以便与变量名相区别。但这并非规定,也可用小写字母。 (2) 使用宏名代替一个字符串,可以减少程序
5、中重复书写某些字符串的工作量。简单不易出错,一改全改。使用宏定义,可以提高程序的通用性. (3) 宏定义是用宏名代替一个字符串,也就是作简单的置换,不作正确性检查。 (4) 宏定义不是C语句,不必在行末加分号。 (5) #define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。通常,#define命令写在文件开头,函数之前,作为文件一部分,在此文件范围内有效。 (6) 可以用#undef命令终止宏定义的作用域,#define ge 8.8 main() | GE的有效范围 #undef ge f1() 由于#undef的作用,使GE的作用范围在#undef行处终止,
6、因此在f1函数中,ge不再代表8.8。这样可以灵活控制宏定义的作用范围。,(7) 在进行宏定义时,可以引用已定义的宏名,可以层层置换。 例 #define R 3.0 #define PI 3.1415926 #define L 2*PI*R #define S PI*R*R main() printf(“L=%fns=%fn“,L,S); (8) 对程序中用双括号括起来的字符串内的字符,即使与宏名相同,也不进行置换。 (9) 宏定义是专门用于预处理命令的一个专用名词,它与定义变量的含义不同,只作字符替换,不分配内存空间。,例如: #define N 10 #define TRUE -1 #d
7、efine FALSE 0 #define ON 1 #define OFF 0 #define YES 1 #define NO 0 #define PI 3.14159 #define E 2.7183 #define BLACK 0 #define BLUE 1 #define BEGIN #define END ,1.2 带参数的宏定义 与函数可带形式参数一样,宏标识符也可带有参数。在程序中可用实参数替带形式参数,实现宏调用。 不是进行简单的字符串替换,还要进行参数替换。 其定义的一般形式为 #define 宏名(参数表) 字符串 字符串中包含在括弧中所指定的参数。如: #define
8、 s(a,b) a*b area=s(3,2);,定义矩形面积S,a和B是边长。在程序中用了s(3,2),把3、2分别代替宏定义中的形式,历年真题必学,真题1:下列程序的输出结果是( )。【2005.4】 #define P 3 void F(int x)return(P*x*x); main( ) printf(%dn,F(3+5); A)192 B)29 C)25 D)编译出错 真题2:下列叙述中正确拘是( )。【2005.4】 A)预处理命令行必须位于源文件的开头 B)在源文件的一行上可以有多条预处理命令 C)宏名必须用大写字母表示 D)宏替换不占用程序的运行时间,真题3:有下列程序:【
9、2005.9】 #define f(x)(x*x) main( ) int i1,i2; i1=f(8)/f(4); i2=f(4+4)/f(2+2); printf(%d, %dn,i1,i2); 程序运行后的输出结果是( )。 A)64,28 B)4,4 C)4,3 D)64,64,真题4:下列函数rotate的功能是:将a所指N行N列的二维数组中的最后一行放到b所指二维数组的第0列中,把a所指二维数组中的第0行放到b所指二维数组的最后一列中,b所指二维数组中其他数据不变。【2005.9】 #define N 4 void rotate(int a N,int b N) int i,j;
10、for(i=0;in;i+) biN-1= (1) ; (2) =aN-1i; ,(1) a0i (2) bi0,真题5:有下列程序:【2006.9】 #include #define N 5 #define M N+1 #defune f(x) (x*M) main( ) int i1,i2; i1=f(2); i2=f(1+1); printf(%d %dn,i1,i2); 程序的返行结果是( )。 A)12 12 B)11 7 C)11 11 D)12 7,真题6:下列程序由两个源程序文件:t4.h和t4.c组成,程序编译运行的结果是: 。【2006.9】 t4.h的源程序为: #def
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 预处理 动态 存储
链接地址:https://www.31doc.com/p-3412742.html