|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
编译于预处理指令
预处理指令
就是提前处理的指令,提前指的是在正式编译源代码之前,对预处理指令进行处理,将其替换成具有实际意义的内容,然后再进行编译。这么做的目的是为了改进程序设计环境,提高编程效率。
宏定义
宏定义是以 “#” 开头的,均为预处理命令,使用 “define” 作为宏定义命令,用一个标识符来代表一个字符串,我们把这种特殊的指令称为宏定义,“标识符” 为所定义的宏名。“字符串” 可以是常数、表达式、格式串等。规模比较大的项目都会使用大量的宏定义来组织代码。C语言对宏的使用有很多复杂的规则,但是有些并不常用。
宏定义,根据标识符的形式,大体上可以分为两种,分别是变量式宏定义和函数式宏定义。变量式宏定义的书写类似于变量的声明,用来定义常量,函数式宏定义的书写类似于函数,用来定义稍复杂些的带参数的表达式。
写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性、可读性、方便性等。
变量式宏定义
一般形式为:
#define 标识符 字符串
把变量式宏定义细化,可分成如下几个方面,下面分别举例说明。
1.宏定义和浮点数
例题1:使用变量式宏定义圆周率PI计算圆的周长和面积。
- #include<stdio.h>
- #define PI 3.1415926 //变量式宏定义,PI是宏名
- int main()
- {
- int r; //定义圆的半径变量r
- float c,a; //定义圆的周长和面积变量c和a
- printf("请输入圆半径:");
- scanf("%d",&r);
- c = 2*PI*r; //使用宏
- a = PI*r*r;
- printf("圆的周长是:%.3f\n",c);
- printf("圆的面积是:%.3f\n",a);
- return 0;
- }
复制代码
例题分析:
本范例两次使用了圆周率PI。使用宏定义使程序简洁了不少,而且修改圆周率PI也方便了很多。
2.宏定义和运算符
例题2:输入两个数使用变量式宏定义和关系运算符比较两个数的大小。
- #include<stdio.h>
- #define D >
- #define X <
- #define E ==
- int main()
- {
- int i,j;
- printf("请输入两个数:");
- scanf("%d %d",&i,&j);
- if(i D j)
- printf("%d大于%d\n",i,j);
- else if(i E j)
- printf("%d等于%d\n",i,j);
- else if(i X j)
- printf("%d小于%d\n",i,j);
- else
- printf("不存在这样的值\n");
- return 0;
- }
复制代码
例题分析:
本范例中,对关系运算符之类的运算符一样可以使用宏定义。
3.宏定义和整数、字符串
例题3:输入5个范围1~9的整数,如果输入的数字超过范围,则提示重新输入。输入完毕,按照从大到小的关系排序后输出。
- #include<stdio.h>
- #define T 1
- #define F 0
- #define S 5
- #define N "\n" //宏定义
- int main()
- {
- int i,j,t,num;
- int array[S];
- int total=0;
- int again=T;
- printf("请输入%d个范围1~9之间的数据,否则将提示重新输入。",S);
- printf(N);
- printf("请输入数据:");
- while(total<S) //循环输入数据
- {
- scanf("%d",&num);
- if(num>0&&num<10) //输入有效性判断
- again=T; //使用宏
- else
- again=F;
- if(again==T) //使用宏
- {
- array[total]=num;
- total++;
- printf("请输入数据:");
- }
- else
- printf("请重新输入:");
- }
- printf("按照从大到小输出如下:");
- printf(N); //使用宏
- for(i=0;i<S-1;i++) //排序
- {
- for(j=i;j<S;j++)
- {
- if(array[i]<array[j]) //交换条件
- {
- t=array[i];
- array[i]=array[j];
- array[j]=t;
- }
- }
- }
- for(i=0;i<S;i++) //循环输出
- printf("%d ",array[i]);
- printf(N);
- return 0;
- }
复制代码
例题分析:
本范例综合使用了宏定义,如整数和字符串,输入N个正整数,输入错误就提示重新输入,然后再按照从大到小的顺序输出。
4.宏定义和表达式
例题4:使用变量式宏定义表达式计算表达式x*x+2*x的值
- #include<stdio.h>
- #define M (x*x+2*x) //宏定义表达式
- int main()
- {
- int sum,x; //声明变量
- printf("请输入一个数字:");
- scanf("%d",&x);
- sum=2*M+3*M+4*M; //使用宏
- printf("sum=%d\n",sum);
- return 0;
- }
复制代码
例题分析:
本范例比较特别,使用宏名M作为表达式,在主函数中必须定义变量x,否则会编译错误,原因是宏展开后程序中需要用到变量x。题中宏定义的作用指定标识符M来代替表达式(x*x+2*x)。在编写源程序时,所有的(x*x+2*x)都可以由M代替。而对源程序编译时,将先由预处理程序进行宏代换,即用(x*x+2*x)表达式去置换所有的宏名M,然后编译程序。程序中首先进行了宏定义,定义M来替代表达式(x*x+2*x)。在 sum=2*M+3*M+4*M中进行宏展开后,该语句变为:
sum=2*(x*x+2*x)+3*(x*x+2*x)+4*(x*x+2*x);
但需要注意的是,在宏定义中表达式(x*x+2*x)两边的括号不能少,否则会发生错误。 |
|