当前位置:高等教育资讯网  >  中国高校课件下载中心  >  大学文库  >  浏览文档

济南大学:《C语言程序设计》课程教学资源(PPT课件)第九章 宏定义(袁宁)

资源类别:文库,文档格式:PPT,文档页数:15,文件大小:114.5KB,团购合买
预处理命令概述 9.1 宏定义 9.2 “文件包含”处理
点击下载完整版文档(PPT)

第九章预处理命令 ■预处理命令概述 ■91宏定义 ■92“文件包含”处理

第九章 预处理命令 ◼ 预处理命令概述 ◼ 9.1 宏定义 ◼ 9.2 “文件包含”处理

预处理命令概述 1.概念 编译预处理是在编译前对源程序进行的一些预加工 预处理由编译系统中的预处理程序,按源程序中的预处理 命令进行 2.预处理命令 C语言的预处理命令均以“#”打头,末尾不加分号 预处理命令可以出现在程序的任何位置, 其作用域是从出现点到所在源程序的末尾 3.优点:能改善程序设计的环境, 有助于编写易移植,易调试的程序

预处理命令概述 1. 概念 编译预处理是在编译前对源程序进行的一些预加工 预处理由编译系统中的预处理程序, 按源程序中的预处理 命令进行 2. 预处理命令 C语言的预处理命令均以“ # ”打头, 末尾不加分号 预处理命令可以出现在程序的任何位置, 其作用域是从出现点到所在源程序的末尾 3. 优点 : 能改善程序设计的环境, 有助于编写易移植, 易调试的程序

91宏定义 称为宏名 不带参数的宏定义 1格式:#dene标识符字符串一为宏体 2.说明: (1)标识符也称宏名,一般用大写字母表示 (2)预处理时将程序中所有的宏名用宏体替换,该过程称 使“宏展开”;但在程序中用“”括起来的字符串中,即 有的字符串与宏名相同,也不进行替换 #define SIze 20 void main o 输出结果:SIZE=35 int x, X= SIZE+I5 printf(“sLE=%dmn”,x);

9.1 宏定义 一、 不带参数的宏定义 1. 格式 : #define 标识符 字符串 2. 说明 : (1) 标识符也称宏名, 一般用大写字母表示 (2) 预处理时将程序中所有的宏名用宏体替换, 该过程称 “宏展开”; 但在程序中用“ ” 括起来的字符串中, 即 使 有的字符串与宏名相同, 也不进行替换 #define SIZE 20 void main ( ) { int x ; x = SIZE+15 ; printf( “ SIZE=%d \n”, x ) ; } 称为宏体 输出结果: SIZE=35 称为宏名

(3)宏定义只是一种简单的字符替代,不进行语法检查 若将# define SIzE20的零写成英文字母“o°, 程序中的x=SE+15;会替换为x=20+15; 这时才会发现错误 (4)宏定义不是C语句,行末不加分号, 每条宏命令要单独占一行 (5)# define命令出现在函数的外部,宏名的有效范围为 定义命令之后到本文件结束 (6)可以用# undef命令终止宏定义的作用域

(3) 宏定义只是一种简单的字符替代, 不进行语法检查 若将#define SIZE 20 的零写成英文字母‘o’, 程序中的 x = SIZE+15 ; 会替换为x = 2o+15; 这时才会发现错误 (4) 宏定义不是C语句, 行末不加分号, 每条宏命令要单独占一行 (5) #define命令出现在函数的外部, 宏名的有效范围为 定义命令之后到本文件结束 (6) 可以用#undef 命令终止宏定义的作用域

(7)宏定义可以嵌套使用 例# define10 #define w 20 #define s Lxw (8)宏定义与变量定义不同,它只作字符替换, 不分配内存空间 3.使用宏替换的优点:提高程序的可读性,易于修改 带参数的宏定义 1.格式:# define宏名(形参表)字符串

(7) 宏定义可以嵌套使用 例 #define L 10 #define W 20 #define S L*W (8) 宏定义与变量定义不同, 它只作字符替换, 不分配内存空间 3. 使用宏替换的优点: 提高程序的可读性, 易于修改 二、 带参数的宏定义 1. 格式 : #define 宏名( 形参表) 字符串

2.说明 (1)宏定义时宏名与括号之间没有空格, 若有空格则会把空格后的所有字符都看成是宏体 □(2)带参数的宏在替换时不仅宏名被宏体替换, 同时形参被实参替换 (3)建议带运算符的宏体和形参要用()括起来 例# define p3.14159 #define s(r) Piror void main() float a, area 宏替换: area=S(a);4………area=3.14159*aa; a=3.6 printf(“%fn”,area);

2. 说明 (1) 宏定义时宏名与括号之间没有空格, 若有空格则会把空格后的所有字符都看成是宏体 (2) 带参数的宏在替换时,不仅宏名被宏体替换, 同时形参被实参替换 (3) 建议带运算符的宏体和形参要用 ( ) 括起来 例 #define PI 3.14159 #define S(r) PI*r*r void main ( ) { float a , area ; a = 3.6 ; area = S(a); printf( “ %f \n”, area) ; } 宏替换: area = 3.14159*a*a ;

#define pl 3.14159 # define s(r)P(r)(r)带括号的宏替换: void main() area=3.14159*(a+b) *(a+b); float a, b, area i a=3.6; b=1.2; 不带括号的宏替换: area=S(a+b) area =3.14159*a+b*a+b printf(“%fn”,area);

void main ( ) { float a , b , area ; a = 3.6 ; b = 1.2 ; area = S(a+b); printf( “ %f \n”, area) ; } #define PI 3.14159 #define S(r) PI* r * r 不带括号的宏替换: area = 3.14159*a+b*a+b ; 带括号的宏替换: area = 3.14159*(a+b)*(a+b) ; #define PI 3.14159 #define S(r) PI*(r)*(r)

(#define SQUARE(x)x*x 2#define SQUARE(x)(x)*(x) 3#define SQUARE(x)((x)*(x)) 若a= SQUARE(n+1) 若a=27/ SQUARE(3.0 宏展开 出错|宏展开 ①a=n+1*n+1 ①a=2.713.030出错 ②a=(n+1)*(n+1) ②a=2.7/(3.0)*(3.0) ③a=(n+1)*(n+1) ③a=27/(3,0)*(3

① #define SQUARE(x) x*x ② #define SQUARE(x) (x)*(x) ③ #define SQUARE(x) ((x)*(x)) 若 a=2.7/SQUARE(3.0) 宏展开 ① a=2.7/3.0*3.0 ② a=2.7/(3.0)*(3.0) ③ a=2.7/((3.0)*(3.0)) 若 a=SQUARE(n+1) 宏展开 ① a=n+1*n+1 ② a=(n+1)*(n+1) ③ a=((n+1)*(n+1)) 出错 出错

3带参数的宏与函数的区别 (1)函数调用时先求出实参表达式的值再代入形参 带参数的宏定义只是进行简单的字符替换 (2)函数调用是在程序运行时处理,分配临时的内存单元 宏展开是在编译时进行的,在展开时不分配内存单元 (3)对函数的形参和实参都要定义类型,且要求一致 宏不存在类型问题,宏名无类型,其参数也无类型 (4)调用函数只可得到一个返回值, 使用宏可以设法得到几个结果 (5)函数调用不会使源程序变长,宏展开会使源程序增长 (6)函数调用占用运行时间, 宏展开不占运行时间,只占编译时间

3. 带参数的宏与函数的区别 (1) 函数调用时,先求出实参表达式的值,再代入形参 带参数的宏定义只是进行简单的字符替换 (2) 函数调用是在程序运行时处理, 分配临时的内存单元 宏展开是在编译时进行的, 在展开时不分配内存单元 (3) 对函数的形参和实参都要定义类型, 且要求一致 宏不存在类型问题, 宏名无类型, 其参数也无类型 (4) 调用函数只可得到一个返回值, 使用宏可以设法得到几个结果 (5) 函数调用不会使源程序变长, 宏展开会使源程序增长 (6) 函数调用占用运行时间, 宏展开不占运行时间, 只占编译时间

#define max(x, y)(x)>y? (x):(y main( ( int a, b c, d, t; 宏替换: t=(a+b)>(c+d)?(a+b):(c+d); t=MAX(a+b, c+d 函数调用: t= max(a+b, c+d); int max(int x, int y) freturn(x>y?x: y); t=max (a+b, c+d); main int a, b, c, d, t;

#define MAX(x,y) (x)>(y)?(x): (y) main( ) ( int a,b,c,d,t; ……. t=MAX(a+b,c+d); ……. } 宏替换: t = (a+b)>(c+d) ? (a+b):(c+d); int max(int x,int y) {return( x > y ? x : y ) ;} main( ) ( int a,b,c,d,t; ……. t=max(a+b,c+d); ……. } 函数调用: t = max(a+b,c+d);

点击下载完整版文档(PPT)VIP每日下载上限内不扣除下载券和下载次数;
按次数下载不扣除下载券;
24小时内重复下载只扣除一次;
顺序:VIP每日次数-->可用次数-->下载券;
共15页,试读已结束,阅读完整版请下载
相关文档

关于我们|帮助中心|下载说明|相关软件|意见反馈|联系我们

Copyright © 2008-现在 cucdc.com 高等教育资讯网 版权所有