一、#define的基本语法
在C语言中,常量是使用频率很高的一个量。常量是指在程序运行过程中,其值不能被改变的量。常量常使用#define来定义。
使用#define定义的常量也称为符号常量,可以提高程序的运行效率。
其常见的用法包括两种,分别是:
1)#define 宏名 宏值
2)#define 宏名(参数列表) 表达式
第一种语法就是定义符号常量,
例如:
#define N 100
此后直到#undef N之前, N的值都是100。当遇到#undef N,其后如果再出现N,则N需要重新定义之后才可以使用。
第二种语法常用来定义符号函数。
例如:
#define AREA(x,y) (x)*(y)
表示用来求长和宽分别是x和y的矩形的面积。
需要注意的是,在表达式(x)*(y)中,x和y都要使用“()”括起来,这是因为符号函数在编译时时进行符号形式替换。如果不加()则可能会发生意想不到的错误,例如:
#define AREA(x,y) x*y
...
A = AREA( 2+3, 1+2 );
此处预期的结果是15,但是实际的结果却是7,这是因为该段代码在编译进行了简单的符号替换而得到的实际表达式是:
A = 2+3 * 1+2;
根据运算符的优先级,先进行乘法运算,然后才是加法,这就导致了错误。
而如果使用
#define AREA(x,y) (x)*(y)
...
A = AREA( 2+3, 1+2 );
则在编译时替换的结果是:
A = (2+3) * (1+2);
所以实际运行结果是15。
二、#define使用示例
1.表示静态数组的长度
由于定义数组的基本语法规则是:
类型说明符 数组名[常量表达式];
因此“常量表达式”常常是使用#define定义的常量,例如:
Demo1:从键盘输入指定个数的整数序列,然后计算其数学期望和方差。
参考代码为:
#include"stdio.h"
#define N 10 //定义常量
int main()
{
int i, sum, sum2, arr[N] = { 100, 50, 76, 85, 91, 70, 100, 50, 99, 40 };
float expn, var;
//数学期望,也就是平均值
sum = 0;
for( i=0; i<N; i++ )
{
sum += arr[i];
}
expn = float(sum) / N;
//方差
sum2 = 0;
for( i=0; i<N; i++ )
{
sum2 += (arr[i] - expn) * (arr[i] - expn);
}
var = float(sum2) / (N-1);
printf( "数学期望:%f\n", expn );
printf( "方差 :%f\n", var );
return 0;
}
运行结果:
2.定义字符常量
Demo2:从键盘输入一组整数,并计算其和。要求遇到’#’则结束输入。
参考代码:
#include"stdio.h"
#define STOPFLAG '#'
int main()
{
int data, sum = 0;
char ch;
printf( "输入整数(最后一个数据后面加#结束):\n" );
while(1)
{
scanf( "%d", &data );
sum += data;
ch = getchar();
if(ch == STOPFLAG )
{
break;
}
}
printf( " sum = %d\n", sum );
return 0;
}
运行结果:
3.定义字符串常量
参考代码:
#include"stdio.h"
#define STRING "Hello World."
int main()
{
printf( " %s\n", STRING );
return 0;
}
运行结果:
4.定义简单的函数
使用#define定义符号常量函数,且该常量被多次调用,则可以提高程序的运行效率。
Demo4:计算半径R为不同值时圆的面积。
参考代码:
#include"stdio.h"
#define AREA(R) 3.14 * (R) * (R)
int main()
{
printf( "R = 1, area = %f\n", AREA(1) );
printf( "R = 1+2, area = %f\n", AREA(1+2) );
printf( "R = 1+2+1, area = %f\n", AREA(1+2+1) );
return 0;
}
运行结果:
三、#define使用注意事项
1.使用#define定义带有运算符的符号常量时,一定要对每个量都加上圆括号,以避免出现不必要的错误。
2.符号常量同名的问题:
以下写法是正确的
#include"stdio.h"
#define PROD 2 * 5
#define PROD 2 * 5
int main()
{
printf( "%d", PROD );
return 0;
}
但是以下使用#define定义PROD 会提示告警:第三行代码“PROD ”redefiened
#include"stdio.h"
#define PROD 2 * 5
#define PROD 2*5
int main()
{
printf( "%d", PROD );
return 0;
}
也就是说,使用#define定义重复的符号常量时,如果运算符的前后都有空格,则不提示告警,否会提示告警。因此使用#define带有运算符的常数之间的运算需要注意符号常量不要重名。