每日一学16
编译于预处理指令预处理指令
就是提前处理的指令,提前指的是在正式编译源代码之前,对预处理指令进行处理,将其替换成具有实际意义的内容,然后再进行编译。这么做的目的是为了改进程序设计环境,提高编程效率。
宏定义
宏定义是以 “#” 开头的,均为预处理命令,使用 “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;
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=num;
total++;
printf("请输入数据:");
}
else
printf("请重新输入:");
}
printf("按照从大到小输出如下:");
printf(N); //使用宏
for(i=0;i<S-1;i++) //排序
{
for(j=i;j<S;j++)
{
if(array<array) //交换条件
{
t=array;
array=array;
array=t;
}
}
}
for(i=0;i<S;i++) //循环输出
printf("%d ",array);
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)两边的括号不能少,否则会发生错误。 例题3:输入5个范围1~9的整数,如果输入的数字超过范围,则提示重新输入。输入完毕,按照从大到小的关系排序后输出。
#include
#define T 1
#define F 0
#define S 5
#define N "\n" //宏定义
int main()
{
int i,j,t,num;
int array;
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)
{
array = num;
}
else
{
printf("输入的数据不在1~9之间,请重新输入:");
}
}
// 排序
for(i = 0; i < S - 1; i++)
{
for(j = i + 1; j < S; j++)
{
if(array < array)
{
t = array;
array = array;
array = t;
}
}
}
printf("从大到小排序后的数字是:\n");
for(i = 0; i < S; i++)
{
printf("%d ", array);
}
printf(N);
return 0;
}
例题分析:
在这个例子中,我们使用宏定义定义了一些常量以提高代码的可读性和易维护性。例如,`S`定义为5,表示要输入的数字个数。通过宏定义使代码显得更加整洁,并且在需要修改时更简单方便。排序部分使用了简单的冒泡排序算法,实现从大到小的排序。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]