内容正文:
YCF
正版可修改PPT
(中职)C语言程序设计模块十ppt电子课件
1
预处理命令
模块10
LOGO
10.1无参宏定义及宏代换
所谓无参宏定义,指的是宏名(标识符)后面不带参数。
定义方法:
#define 标识符 字符串/*字符串可以是常量、表达式和格式串*/
其意为:在书写时,用标识符代替其后的字符串出现于程序中;而在程序执行时,则用字符串去代换标识符。这就是宏代换。
10.1无参宏定义及宏代换
#include <stdio.h>
#define A(x*x+2*x)/*注意下面整个表达式用()括起来时的展开方法 */
#define Bx*x+2*x/*注意下面表达式没用()括起来时的展开方法*/
#define M("%d,%d,%d\n")/*格式串*/
#define P(A*y+c)/*宏定义嵌套*/
#define RB*y+c
int main()
{int x,y,s1,s2,a=3,b=4,c;
c=a+b;
printf("Input x:");
scanf("%d",&x);/*假设输入3*/
y=2;
s1=2*A; /*展开方法:2×(3×3+2×3)=30,故s1为30 */
s2=2*B; /*展开方法:2×3×3+2×3=24,故s2为24 */
【例10-1】不同方式无参宏代换详解。
10.1无参宏定义及宏代换
a=b;/*a重新获得4*/
b=c;/*b重新获得7*/
c=a+b; /*c重新获得4+7=11*/
printf("s1=%d,s2=%d\n",s1,s2);
printf(M,a,b,c);/*按格式串宏代换输出a,b,c,注意宏名只能直接引用,不能加引号*/
printf("(A*y+c)=%d\n",P);/*展开:(3×3+2×3)×2+11=41*/
printf("A*y+c=%d\n",3*R); /*展开:3×3×3+2×3×2+11=50*/
}
#undef A/*终止A的作用域,
即其代替作用到此为止,下同*/
#undef B
#undef M
#undef P
输出结果如下:
Input x:3
s1=30,s2=24
4,7,11
(A*y+c)=41
A*y+c=50
10.1无参宏定义及宏代换
从上面的程序中可以得出以下结论:
(1)宏定义一般不用带符号结束,如 “#define A(x*x+2*x)”。
(2)当宏名后面的字符串以“()”括起来时,展开时它是一个整体进行运算。例如:
#define A(x*x+2*x)
s1=2*A;
实际就是“s1=2*(x*x+2*x)”。
(3)若宏名后面的字符串不以“()”括起来,展开时是按序展开的。例如:
#define Bx*x+2*x
s2=2*B;
实际就是“s2=2*x*x+2*x”。
可见,宏名后的字符串用“()”和不用,宏代换时其意完全不同。因此,在进行下面的运算时,算法就完全不同:
10.1无参宏定义及宏代换
#define P(A*y+c)
#define RB*y+c
printf("(A*y+c)=%d\n",P);
printf(“A*y+c=%d\n”,3*R);
P表示“(A*y+c)”,运算过程是“((x*x+2*x)*y+c)”。
R表示“B*y+c”,3*R的运算过程就是“3*x*x+2*x*y+c”。
(4)#undef用于强制中止宏名的作用域,若不中止,则其作用域为到程序结束。
(5)宏名只能直接引用,若加引号,加双引号做字符串处理,加单引号做字符处理。
(6)为与变量名区别开来,宏名一般用大写。还可用宏定义表数据类型。例如:#define DB double
#define STU struct student
DB m;
STU st[20],*p=st;
最后须强调一点的是,预处理程序不会对错误的宏定义进行检查。
10.2带参宏定义与宏调用
带参宏定义就是“宏名(标识符)”后带了参数,参数用“()”括起来。
(1)定义方式(要注意形参表和标识符之间不能有空格)。
(2)调用方式:
标识符(实参表);
【例10-2】带参宏定义与调用示例。
#include <stdio.h>
#define PI 3.14
#define S(r)(PI*r*r)/*计算圆的面积*/
#define L(x,y,z)(x)*(y)+(z)/*形参表x,y